SQL查询有时会变得很难处理。所以我有一个包含多个OR操作和REGEX的SQL查询。在运行JAVA代码时,执行时间超过了大量数据条目的预期时间。
以下是查询:
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 :(得分: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作为参数。