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操作而发生滞后。帮助将不胜感激。
运行'EXPLAIN',它可能会提供一些关于查询完成的数据过滤的输入。你也可以尝试在'col3'条件下使用'BETWEEN'。 –
你是如何计算预期时间的?你是否直接针对数据库运行完全相同的查询?如果你使用hibernate,你不应该写一个普通的sql查询 – XtremeBaumer
@XtremeBaumer请检查更新后的问题。是的,运行相同的查询会在相同的数据上产生2秒的结果。编写普通的sql查询的原因是REGEX,因为我找不到使用标准或hql实现正则表达式的最佳方法。 –