oracle JPA标准API性能问题JBoss 7.4

hgc7kmma  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(74)

我在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产生这种外部选择吗?任何提示将不胜感激。

sycxhyv7

sycxhyv71#

您不希望删除外部查询,因为它正在生成内联视图,并且不应影响性能。
但是,您的查询:

select *
from   (
  select ...
  where  (component = '...' )
  and    (delivered = 'Delivered' )
  and    rownum <= 200
  order by entrytime desc
);

(可能)不正确,因为WHERE ... rownum <= 200过滤器将在ORDER BY子句之前应用,因此您将获得匹配所有WHERE过滤器的前200行(随机选择),然后对这200行进行排序。
如果您要对结果进行分页,那么您(可能)希望首先对结果集进行排序,然后获取前200行,以便获取具有最新日期的行,而不是随机选择的行。

select *
from   (
  select ...
  where  (component = '...' )
  and    (delivered = 'Delivered' )
  order by entrytime desc
);
where  rownum <= 200

但是这将比第一个查询的性能差,因为它必须对整个结果集进行排序,然后获取最新的200行。
然后,您可以查看加快查询的技术,例如:

  • 增加指标;
  • 对表进行分区;
  • 通过删除连接使查询更有效(尽管您没有给予查询文本,因此我们对此无能为力);

相关问题