2010-12-07 82 views
2

我正在搜索我的一個表(傳統數據庫)並在此處收到可怕的時間。查詢是由Hibernate的標準API,例如:Hibernate,DB2 - 運行緩慢的查詢

Criteria crit = getSessionFactory().getCurrentSession().createCriteria(P1.class); 
crit.add(Restrictions.sqlRestriction("{alias}.compno like ?", "%" + s + "%", new StringType())); 
crit.setMaxResults(25); 
crit.setFirstResult(0); 
crit.addOrder(Order.asc("compno")); 
crit.list(); 

建立正如你可以看到我已經在做尋呼這裏以改善更流暢。該標準平均需要~6 seconds

那麼它看起來像這樣

select * from SCHEM.P1 where compno like '%100%' order by compno fetch first 25 rows only 

本地查詢只需要10 ms這是一個巨大的差異海事組織。爲什麼標準運行如此緩慢?我需要切換回原生的SQL查詢嗎?

上的評論好一點:

是有一些關係,這是我沒有對範圍:

<set name="pI" table="P12" lazy="false"> 
    <key column="awcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P12" not-found="ignore"/> 
</set> 
<one-to-one name="info" class="org.gee.hibernate.P13" /> 

<set name="ma" table="P03" lazy="true" schema="SCHEMP" mutable="false" > 
    <key column="macountry" property-ref="land" update="false" /> 
    <one-to-many class="org.gee.hibernate.P03" not-found="ignore" /> 
</set> 


<set name="users" table="P15" lazy="true"> 
    <key column="apcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P15" not-found="ignore"/> 
</set> 
+0

需要更多信息,請看:你用一個一對多/多到一個/多個一對多在實體? – 2010-12-07 10:58:18

+0

雖然更新了我的問題。 – onigunn 2010-12-07 11:08:00

回答

3

我的提示是:

<set name="pI" table="P12" lazy="false"> 
    <key column="awcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P12" not-found="ignore"/> 
</set> 

這個系列是不能偷懶。這可能是你的瓶頸。

你需要所有信息嗎?如果您只想讀取ID,您可以用hibernate讀取實體的字段。

+0

是的,你是在這裏。刪除此關係解決了查詢時間慢的問題。謝謝你以這種方式暗示我! – onigunn 2010-12-07 12:06:14

0

我說看看數據庫日誌檢查什麼是執行的確切的SQL指令。 Hibernate可能加載的不僅僅是你期望的本地查詢,因爲它可能會加載渴望的集合等。

因此 - 啓用Hibernate查詢日誌記錄,或更好地檢查數據庫日誌以查看執行的內容。