我正试图解决一个非常奇怪的行为。
我正在使用:
JBoss AS 7.1.1
EJB 3.0
JPA
XA DataSource
Oracle 11g
在其中一个系统功能中,用户可以看到每个Store
的状态。对于每个Store
,我触发一个查询,以总结所有已处理的文件。查询是这样的:
SELECT
SUM(CASE file.type
WHEN 'TYPE_1' THEN 1
ELSE 0
END)
,
SUM(CASE file.type
WHEN 'TYPE_2' THEN 1
ELSE 0
END)
,
SUM(CASE file.type
WHEN 'TYPE_3' THEN 1
ELSE 0
END)
FROM
File file
WHERE
file.type IN ('TYPE_1', 'TYPE_2', 'TYPE_3')
AND file.status = 'RECEIVED'
AND file.store.id = :storeId
问题是,用户可以选择他想要检查的商店,这就是事情变得怪异的地方。
当我检查第一家商店时,结果非常快,但所有后续查询都需要更多时间。让我举例说明:
现在注意这部分,这非常重要。
这很奇怪,以前需要一段时间的同店,现在加载速度非常快。
每当我在SQLDeveloper
上尝试查询时,结果也会非常快。
我用EJB
注释了我的@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
,但我没有对执行时间产生任何影响。
我创建了一个独立项目,使用JDBC
运行查询,结果再次快速,这让我觉得可能是我的DataSource
,persistence.xml
或其他类似的配置这一点。
有没有人知道为什么会这样?
答案 0 :(得分:1)
一些事情:
begin
dbms_stats.gather_table_stats(user,'file' , estimate_percent=>100);
end;
这将确保表格的统计数据准确无误。
你可以优化查询,你不必执行3次“总和”,你可以这样做:
select f.type , count(*)
from File f
where f.store.id = :storeId
and f.type IN ('TYPE_1', 'TYPE_2', 'TYPE_3')
group by f.type
答案 1 :(得分:1)