Jpa 为什么后续查询会慢得多?

Jpa 为什么后续查询会慢得多?,jpa,oracle11g,ejb,datasource,jboss7.x,Jpa,Oracle11g,Ejb,Datasource,Jboss7.x,我正试图解决一个非常奇怪的行为 我的工作对象是: JBossAS 7.1.1 ejb3.0 JPA XA数据源 Oracle 11g 在其中一个系统功能选项中,用户可以看到每个商店的状态。对于每个存储我都会启动一个查询,以汇总已处理的所有文件。查询如下所示: SELECT SUM(CASE file.type WHEN 'TYPE_1' THEN 1 ELSE 0 END) , SUM(CAS

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

我的工作对象是:

  • JBossAS 7.1.1
  • ejb3.0
  • JPA
  • XA数据源
  • Oracle 11g
在其中一个系统功能选项中,用户可以看到每个
商店的状态。对于每个
存储
我都会启动一个查询,以汇总已处理的所有文件。查询如下所示:

 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
问题是,用户可以选择他想要检查的商店,这就是事情变得奇怪的地方

当我检查第一个存储时,结果非常快,但所有后续查询都要花费大量时间。让我举例说明:

  • 用户检查存储15(极快结果)-大约200毫秒
  • 用户检查存储2(结果非常慢)-大约8000毫秒
  • 现在请注意这一部分,它非常重要

  • 用户注销,然后再次登录
  • 用户检查Store2(花费8000毫秒的一个),现在结果非常快
  • 这很奇怪,之前花了一段时间的同一家商店,现在加载速度相当快。 每当我在
    SQLDeveloper
    上尝试查询时,结果也会很快出现

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

    我使用
    JDBC
    创建了一个独立的项目来运行查询,结果又快了,这让我想到可能是我的
    数据源
    persistence.xml
    或类似的配置

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

    几件事:

  • 当用户第二次检查store2时,oracle优化器可能正在使用它的“缓存”,因此它的速度非常快
  • store2有多少文件记录?尝试执行逐句分组以查看此文件表是否需要特殊统计信息,例如,如果store2的文件记录明显多于其他存储,则尝试执行此方法:
  • 开始
    dbms_stats.gather_table_stats(用户,'file',估计百分比=>100);
    结束;
    
    这将确保表格的统计数据准确无误

  • 您可以优化查询,不必执行3次“求和”,您可以执行以下操作:

    选择f.type,count(*)
    来自文件f
    其中f.store.id=:storeId
    和f.输入('type_1'、'type_2'、'type_3')
    按f.类型分组


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


    /KR

    如何管理会话和事务?如何记录JDBC调用并查看是否执行了除查询以外的其他操作?@OLAP如果它们都由容器管理,我将注入
    EntityManager
    @OldProgrammer的一个实例,我做到了,它只运行我提到的查询奇怪的是,最快的搜索实际上是第一个,而不是其他的。如果它是向后的,我会立即想到缓存,但我从来没有见过它们以这样的顺序运行。不过,我会试试你的建议。谢谢:)这是对同事随后缓慢查询结果的回答。