首页 > 解决方案 > Java Spring Hibernate SQL select with order by Causes in DB2 对性能影响很大

问题描述

我有表 T_LOG,它有几百万行。Hibernate3.6.10.Final使用 Detached Criteria 会产生低效的 SQL 查询,这会导致很大的性能影响。

简化样本:

    select temp.* from ( select row_number() over(order by a.dateTime asc) as rownumber, a.dateTime, a.*
from T_LOG a order by a.dateTime asc) as temp where rownumber <= 75;

问题是order by a.dateTime asc(2),这是多余的,因为整个工作都是由第一条row_number() over(order by a.dateTime asc)(1)完成的。这个额外的第二个order by子句导致的结果比没有它的同一个子句差大约 1000 倍。例如,上面的语句在 2500 万行上需要超过 10 分钟,但是这个简化的语句:

    select temp.* from ( select row_number() over(order by a.dateTime asc) as
 rownumber, a.dateTime, a.* from T_LOG a) as temp where rownumber <= 75;

仅需0.1秒。结果集是一样的。该列dateTime被索引为非唯一索引。

在 Java 中,分离标准(简化)如下所示:

            DetachedCriteria crit = DetachedCriteria.forClass(Log.class);
...
            crit.addOrder(org.hibernate.criterion.Order.asc("dateTime"));

// Used for pagination      
List<Log> logs = logRepository.findByCriteria(crit, from, count);

如何减少分离条件中的 SQL 语句以避免性能影响?

良好成本示例:

SQL 的适当成本

和床位费用:

非常糟糕的 SQL 成本

标签: javasqlhibernatedb2

解决方案


推荐阅读