小编str*_*cer的帖子

为什么查询提示 FIRST_ROWS(1000) 会导致性能下降?

我有一个查询,其中包含用户提供的参数,可以根据用户的输入生成非常多的行。

如果用户提供非常非选择性的参数,则查询需要大量时间才能完成。如果查询将返回超过 1000 行,则应向用户提供错误消息。

该查询没有 order by 子句,只是连接了三个(大)表。

现在的想法是使用查询提示 FIRST_ROWS(1000) 来加速。SQL 开发人员中的测试表明成本指标显着降低(因子 10)。

查询是通过 Entitymanager 使用本机查询执行的。

但是,应用程序中的行为如下:持续时间OraclePreparedStatement.executeQuery减少了 60%。但是,现在花费了更多的时间EJBQueryImpl.getResultList,与省略查询提示相比,之前花费的时间不到 100 毫秒,从而导致性能下降。

代码本质上是:

Query query = em.createNativeQuery(sqlQuery); // sqlQuery has query hint "FIRST_ROWS(" + (maxResults + 1) + ")"

query.setMaxResults(maxResults + 1);

List<Object[]> resultList = query.getResultList();

if (maxResults != 0 && resultList.size() > maxResults) {
    resultSetTruncated = true;
}
Run Code Online (Sandbox Code Playgroud)

查询是:

SELECT ... FROM
    T1 
LEFT OUTER JOIN T2 on T1.pk1 = T2.pk1
        AND T1.pk2 = T2.pk2 
        AND T1.colx …
Run Code Online (Sandbox Code Playgroud)

performance oracle

6
推荐指数
1
解决办法
4127
查看次数

标签 统计

oracle ×1

performance ×1