2015-07-10 64 views
1

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

+0

沒有'order by'的查詢開銷是** 19 **和** 137 **。 –

回答