休眠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 **。 –