2012-07-17 51 views
4

我們的DBA只是對我們的SQL Server數據庫的長時間運行的查詢回來。他認爲我們應該檢查該查詢,看看我們是否可以優化。冬眠做預測性緩存嗎?

問題是查詢不是來自我們的應用程序代碼。它通過主鍵從單個表中加載多條記錄,其中9條是確切的,我們從來沒有通過應用程序的主鍵對該表進行任何查詢。它也絕對是hibernate查詢的名字,hibernate會負責所有的屬性的加載。

所以我想知道如果hibernate做了一些預測緩存,就像拉它認爲我以後可能想要的記錄一樣。對此有何意見?

謝謝。

回答

3

這可能是由於batch fetching執行的查詢:

使用批量抓取,Hibernate可以加載 如果一個訪問代理其他未代理。批量抓取是對懶惰選擇抓取策略的優化。

類/實體的批量抓取更容易理解。考慮 以下示例:在運行時,您有一個會話在 中加載了25個Cat實例,並且每個Cat都擁有對其所有者的引用Person。 Person類映射了一個代理,lazy =「true」。如果您現在通過所有貓迭代 並在每個貓上調用getOwner(),Hibernate將默認通過 執行25條SELECT語句來檢索代理所有者。 您可以調整該行爲在映射人 指定批量大小:

<class name="Person" batch-size="10">...</class> 

Hibernate將只需要執行三次查詢:該模式是10,10, 5.

0

除了batch fetching/subselect fetching,Hibernate自己並沒有進行任何預測性緩存。但是,Hibernate可以暗中提取你所請求的實體 - 例如,它可以獲取渴望關係的目標,並在懶惰關係的情況下初始化訪問的懶惰代理。

因此,如果有問題的表格充當某些關係的目標,您需要檢查這些realtionships是否渴望以及如果他們懶惰,如何訪問它們。