java - 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 语句以避免性能影响?
良好成本示例:
和床位费用:
解决方案
推荐阅读
- c - 通过 C 代码在简单的 shell 上保存历史命令
- mysql - FIND_IN_SET 和截断不正确的 DOUBLE 值错误
- ios - iOS 13+ 中的后台通知中断
- r - 滚动回归回归模型系数提取问题
- sql - Django 单元测试要求删除 MariaDB DB:(1007,“无法创建数据库'test_x_django';数据库存在”)
- python - 有没有办法使用 AWS Lambda 将函数的 JSON 输出保存到 S3?
- java - 未找到 ClassLoader 中的字段 usr_paths
- javascript -
reactJs不在功能下工作导致错误 - swift - iOSDropDown:类型“UIResponder”没有成员“NSNotification”
- twilio - 构建一个 Twilio Autopilot bot IVR 来接听电话并按照说明进行操作