休眠Envers(标准API)将由ID修订自动添加一个条款“order by
”当不加入投影和不添加顺序。此过程加重了查询性能,并显示警告已超出I/O限制。休眠Envers标准API“通过顺序”子句自动
AuditQuery query = getAuditReader().createQuery().forRevisionsOfEntity(MyEntity.class, false, true);
随着 'order by
' 查询使用,没有 'ORDER BY' 30,000字节。 它是一个超过500万行审计表。
我寻求30 100之间或结果:
query.setFirstResult (1);
query.setMaxResults (30);
即使不添加条款 '通过顺序'(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.en最终版本的envers。
没有'order by'的查询开销是** 19 **和** 137 **。 –