使用Hibernate SQL Query,SQL查询执行时间比预期时间长

时间:2017-08-30 10:24:47

标签: java mysql sql hibernate

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操作,我很难搞清楚时间延迟。帮助将不胜感激。

1 个答案:

答案 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作为参数。