Java Hibernate Envers标准API添加了';订购人';自动子句

Java Hibernate Envers标准API添加了';订购人';自动子句,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,HibernateEnvers(标准API)在not被添加到投影和not被添加到顺序时,自动添加一个子句“按ID修订的顺序”。此过程会增加查询性能负担,并显示超过I/O限制的警告 AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(MyEntity.class, false, true); 使用“orderby”,查询使用300000,而不使用“orderby”30000字节。 这是一个超过500万行的审

HibernateEnvers(标准API)在not被添加到投影和not被添加到顺序时,自动添加一个子句
按ID修订的顺序”。此过程会增加查询性能负担,并显示超过I/O限制的警告

AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(MyEntity.class, false, true);
使用“
orderby
”,查询使用300000,而不使用“orderby”30000字节。 这是一个超过500万行的审计表

我寻求30到100个结果:

query.setFirstResult (1);
query.setMaxResults (30);
即使没有添加“orderby”(query.addOrder(…);
)子句,envers也会这样做。生成的查询如下所示,例如:

select *
  from (select e.*
          from MY_ENTITY e,
               MY_REVISION_ENTITY re
         where e.ID_REVISAO = re.ID_REVISAO
           and re.ID_COL_EXTRA = 1234
        order by e.ID_REVISAO desc -- PROBLEM!!!
) Where rownum <= 30;
这是一只虫子

我理解订购的重要性,因为不要随机记录,但这应该是一个自由的选择


我使用了envers的4.1.3.Final版本。

我得出结论,提高查询性能的替代方法应该是:表分区。使用审计策略:
ValidityAuditStrategy
根据开发指南Hibernate Envers()


另外,自定义enver以不添加默认的“
orderby
”。

我得出结论,提高查询性能的替代方法应该是:表分区。使用审计策略:
ValidityAuditStrategy
根据开发指南Hibernate Envers()


此外,自定义不添加默认“
orderby
”的enver。

不带
orderby
的查询成本为19,带子句的查询成本为137。不带
orderby
的查询成本为19,带子句的查询成本为137。
 if (!hasProjection && !hasOrder) {
   String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
   qb.addOrder(revisionPropertyPath, true);
 }