Hibernate Envers (Criteria API)会在未添加投影时按ID修订版自动添加'order by
'条款,而不是添加订单。此过程会增加查询性能,并显示超出 I / O限制的警告。
AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(MyEntity.class, false, true);
使用“order by
”时,查询使用 300,000 且没有'order by' 30,000字节。
这是一个超过500万行的审计表。
我寻求30到100个结果:
query.setFirstResult (1);
query.setMaxResults (30);
即使没有添加'order by'(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;
我注意到org.hibernate.envers.query.impl.RevisionsOfEntityQuery
类在list()
方法中有以下代码块:
if (!hasProjection && !hasOrder) {
String revisionPropertyPath = verEntCfg.getRevisionNumberPath();
qb.addOrder(revisionPropertyPath, true);
}
这是一个错误?
我理解订购不带随机记录的重要性,但这应该是一个自由选择。
我使用4.1.3。最后版本的envers。
答案 0 :(得分:0)
我得出的结论是,提高查询性能的替代方法应该是: 表格分区 。根据开发指南Hibernate Envers(http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html#envers-partitioning)使用审计策略:ValidityAuditStrategy
。
此外,自定义Envers以不添加默认的“order by
”。