【发布时间】:2019-06-15 01:33:21
【问题描述】:
我正在尝试使用 Hibernate createNativeQuery 获取 1000 行。该查询包含两个连接。当我在 SQL 开发人员中执行相同操作时,我看到响应在不到 400 毫秒内出现,但从代码中需要 20 秒才能得到结果。
表格
员工 - id、姓名、country_id、dept_id
国家 - id、country_name、office_count、inflation_rate
部门 - id、部门名称、经理
String queryStr = "Select e.id as id, e.name as empName, c.country_name AS countryName,
d.dept_name AS deptName FROM owner.Employee AS e LEFT OUTER JOIN owner.Country c
ON e.country_id = c.id LEFT OUTER JOIN owner.Dept AS d ON e.country_id = d.id";
List<Object[]> rows = this.getSession().createNativeQuery(queryStr).setMaxResults(1000)
.addScalar( "id", StringType.INSTANCE )
.addScalar( "empName", StringType.INSTANCE )
.addScalar( "countryName", StringType.INSTANCE )
.addScalar( "deptName", StringType.INSTANCE )
.list();
Hibernate 正在执行的可能导致此延迟的附加处理是什么?有什么办法可以优化代码吗?
【问题讨论】:
-
在 SQL Developer 中执行时,IDE 是返回所有行还是只返回前 N 行?如果 IDE 未检索所有行,则比较可能不公平。
-
您的数据表明以下解释。要获取前 20 行(一页数据),经过的时间是 400 毫秒。线性缩放以获得所有 1000 行需要 20 秒。顺便说一句。您在查询中需要 2 到 3 千次索引访问 - 如果索引块在磁盘上,您每秒可以获得大约 100 次磁盘访问,这接近您 20 秒的观察时间。
标签: oracle hibernate query-optimization jave