我在JBoss EAP 7.4.9上使用JPA Criteria API,因为我必须根据GUI上应用的过滤器动态生成不同的SQL。到目前为止,这种方法是有效的,但是在向Oracle数据库中添加了数百万个条目之后,性能下降得如此之快,以至于应用程序无法使用。
我已经看过生成的SQL(在完整的SQL中有一些Join):
select * from ( select .... where (component like 'XTA%' ) and (delivered like 'Delivered' ) order by entrytime desc ) where rownum <= 200;
这将在大约30秒内执行。
我已经修改了SQL开发者中的SQL,删除了外部选择:
select ... where (component = '....' ) and (delivered = 'Delivered' ) and rownum <= 200 order by reportmess0_.entrytime desc ;
令我惊讶的是,这在较低的毫秒范围内执行。
有什么方法可以防止JPA / Criteria API产生这种外部选择吗?任何提示将不胜感激。
1条答案
按热度按时间sycxhyv71#
您不希望删除外部查询,因为它正在生成内联视图,并且不应影响性能。
但是,您的查询:
(可能)不正确,因为
WHERE ... rownum <= 200
过滤器将在ORDER BY
子句之前应用,因此您将获得匹配所有WHERE
过滤器的前200行(随机选择),然后对这200行进行排序。如果您要对结果进行分页,那么您(可能)希望首先对结果集进行排序,然后获取前200行,以便获取具有最新日期的行,而不是随机选择的行。
但是这将比第一个查询的性能差,因为它必须对整个结果集进行排序,然后获取最新的200行。
然后,您可以查看加快查询的技术,例如: