为什么后续查询这么慢?

时间:2013-07-01 17:14:55

标签: jpa oracle11g ejb datasource jboss7.x

我正试图解决一个非常奇怪的行为。

我正在使用:

  • 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

问题是,用户可以选择他想要检查的商店,这就是事情变得怪异的地方。

当我检查第一家商店时,结果非常快,但所有后续查询都需要更多时间。让我举例说明:

  1. 用户检查商店15(快速结果) - 约200毫秒
  2. 用户检查商店2(非常慢的结果) - 约8000毫秒
  3. 现在注意这部分,这非常重要。

    1. 用户注销,然后重新登录。
    2. 用户检查商店2(花费8000毫秒的商店),现在结果非常快。
    3. 这很奇怪,以前需要一段时间的同店,现在加载速度非常快。 每当我在SQLDeveloper上尝试查询时,结果也会非常快。

      我用EJB注释了我的@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED),但我没有对执行时间产生任何影响。

      我创建了一个独立项目,使用JDBC运行查询,结果再次快速,这让我觉得可能是我的DataSourcepersistence.xml或其他类似的配置这一点。

      有没有人知道为什么会这样?

2 个答案:

答案 0 :(得分:1)

一些事情:

  1. 当用户第二次检查store2时,oracle优化器可能正在使用它的“缓存”,因此速度非常快。
  2. store2有多少文件记录?尝试逐句执行以查看此File表是否需要特殊统计信息,例如,如果store2的文件记录比其他商店多得多,则尝试执行此方法:
  3. begin dbms_stats.gather_table_stats(user,'file' , estimate_percent=>100); end; 这将确保表格的统计数据准确无误。

    1. 你可以优化查询,你不必执行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)