1

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

我正在与:

  • 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 毫秒

现在注意这部分,非常重要。

  1. 用户注销,然后重新登录。
  2. 用户检查存储 2(耗时 8000 毫秒的存储),现在结果非常快。

这很奇怪,之前花了一段时间的同一家商店,现在加载速度非常快。每当我尝试对结果进行查询时SQLDeveloper,结果也很快。

我注释了我EJB的,@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)但我在执行时间上没有任何区别。

我创建了一个独立的项目来运行查询JDBC,结果又很快,这让我认为它可能是我的一些配置DataSourcepersistence.xml或者类似的东西。

有谁知道为什么会发生这种情况?

4

2 回答 2

1

一些事情 :

  1. 当用户第二次检查 store2 时,oracle 优化器可能正在使用它的“缓存”,因此速度非常快。
  2. store2 有多少文件记录?尝试逐句执行分组以查看此 File 表是否需要特殊统计信息,例如,如果 store2 的 File 记录比其他存储多得多,则尝试执行此方法:

begin dbms_stats.gather_table_stats(user,'file' , estimate_percent=>100); end; 这将确保表格的统计信息准确无误。

  1. 您可以优化查询,不必执行 3 次“sum”,您可以执行以下操作:

    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

于 2013-07-02T05:46:29.760 回答
1

你可能会遇到基数反馈问题;看看这个博客;

http://orcasoracle.squarespace.com/oracle-rdbms/2012/12/18/when-a-query-runs-slower-on-second-execution-a-possible-side.html

/韩国

于 2013-07-03T13:47:55.830 回答