我有一个查询,其中包含用户提供的参数,可以根据用户的输入生成非常多的行。
如果用户提供非常非选择性的参数,则查询需要大量时间才能完成。如果查询将返回超过 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)