2017-08-30 50 views
2

SQL查询有时会变成一个棘手的问题。所以我有一个由多个OR操作和REGEX组成的SQL查询。在运行JAVA代码时,执行时间超过了大量数据的预期时间。使用Hibernate SQL查询花费较长的时间执行预期时间SQL查询

下面是查询:

SELECT * FROM tableName WHERE (col1 REGEXP ('xyz'|'abc') OR (col2 = 15 AND (col1 REGEXP ('xyz'|'abc')))) AND col3>='2017-08-28' AND col3<='2017-08-30'; 

Hibernate代码:

public List<MyModel> getAllMatchedEntries() { 
     long lStartTime = new Date().getTime(); 
     Query query = ((SQLQuery) getSession().createSQLQuery("SELECT * FROM tableName WHERE (col1 REGEXP :list OR (col2 = 15 AND (col1 REGEXP :list))) AND col3>=:sd AND col3<=:ed"). setResultTransformer(Transformers.aliasToBean(LeadGenViewTable.class)).setParameter("list", regexlist).setParameter("mid", merchant_id).setParameter("todayDate", sd).setParameter("ed", ed)); 
     List<MyModel> list = query.list(); 
     long lEndTime = new Date().getTime(); 
     long output = lEndTime - lStartTime; 
     list= list.stream().filter(distinctByKey(t -> t.getSomeCol())).collect(Collectors.toList()); 
     System.out.println("Time Taken "+output); 
     return list; 
    } 

和令人惊讶的输出日志中:

Time Taken 45616 

我面对一个很难搞清楚的时间由于REGEXP/OR操作而发生滞后。帮助将不胜感激。

+0

运行'EXPLAIN',它可能会提供一些关于查询完成的数据过滤的输入。你也可以尝试在'col3'条件下使用'BETWEEN'。 –

+0

你是如何计算预期时间的?你是否直接针对数据库运行完全相同的查询?如果你使用hibernate,你不应该写一个普通的sql查询 – XtremeBaumer

+0

@XtremeBaumer请检查更新后的问题。是的,运行相同的查询会在相同的数据上产生2秒的结果。编写普通的sql查询的原因是REGEX,因为我找不到使用标准或hql实现正则表达式的最佳方法。 –

回答

0
(col1 REGEXP :list OR (col2 = 15 AND (col1 REGEXP :list))) 

相同

(col1 REGEXP :list) 

有上col3

而正则表达式的指数往往能更好地被改写 - 然后利用指数:

col1 REGEXP ('xyz'|'abc') 
col1 IN ('xyz', 'abc') 
(col1 = 'xyz' OR col1 = 'abc') 

对于IN版本一可以使用java.sql.Array作为参数。