我正在尝试使用Hibernate createNativeQuery来获取1000行。该查询包含两个联接。当我在SQL Developer中执行相同的操作时,我看到响应在不到400毫秒的时间内出现,但是从代码中获取结果需要20秒。
表
员工-身份证,姓名,国家/地区ID,部门编号
国家/地区-ID,国家/地区名称,office_count,通货膨胀率
部门-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正在执行的其他额外处理可能导致此延迟?有什么办法可以优化代码吗?
答案 0 :(得分:1)
我在您的Hibernate代码中看不到任何东西,仅此一个就可以解释性能异常下降。对addScalar()
的调用可能会使速度稍微变慢,但这应该很小。
如果要大大加快查询速度,则需要考虑调整和优化。这是一种应该有用的索引策略:
CREATE INDEX country_idx ON Country (id, country_name);
CREATE INDEX dept_idx ON Dept (id, dept_name);
此策略假定Oracle将对Employee
表进行全表扫描。然后,对于连接中涉及的每个记录,以上两个索引将允许快速查找。