1

我正在尝试使用 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 正在执行的可能导致此延迟的附加处理是什么?有什么办法可以优化代码吗?

4

1 回答 1

0

我在您的 Hibernate 代码中看不到任何东西,仅此一项就可以解释异常缓慢的性能。调用addScalar()可能会稍微减慢速度,但这应该是次要的。

如果您想让您的查询显着加快,那么您需要考虑调整和优化。这是一种应该有帮助的索引策略:

CREATE INDEX country_idx ON Country (id, country_name);
CREATE INDEX dept_idx ON Dept (id, dept_name);

此策略假定 Oracle 将对表进行全表扫描Employee。对于连接中涉及的每条记录,上述两个索引将允许快速查找。

于 2019-06-15T01:44:34.180 回答