2012-04-26 189 views
4

我想問你們如何在映射中一般使用batch-size。你通常在任何映射集合上設置一個特定的數字嗎?當然,我確實知道其他獲取策略,如join fetch,但有時我必須在後期處理過程中進行過濾,這可能會引發很多延遲加載。我想通過設置批量大小到100,在這種情況下我有更好的表現。NHibernate和批量大小

您是否在任何映射集合上設置了此屬性?如果沒有,爲什麼不呢?會有什麼缺點嗎?

THX對於任何輸入 sl3dg3

回答

4

上收集或父實體設置batch-size打算幾乎做同樣的事情。

batch-size究竟是在做什麼,取出SELECT N+1問題並將其轉化爲SELECT N/batch-size + 1條件。

有一個缺點,那就是你需要平衡設置正確數字的區別。如果批量過大,則會加載太多數據,如果過小,則仍會有太多查詢。你如何平衡這一點是開放的辯論,沒有設置測試是不可能衡量的。

我認爲這是一個微型優化,因爲它可以真正減少select/n + 1問題。然而,它並不像獨立地爲每個場景選擇正確的獲取策略一樣重要,這使得總體上更好的策略。

我也認爲這是一個生產問題,應該根據真實數據對真實用戶進行測試。

作爲一個便箋,我總是設置我的batch-size等於我的分頁大小,不要問我爲什麼它只是感覺不錯!

+0

如何加載太多的數據?無論如何,它需要被加載。就我的批量大小而言,它只將許多不同的查詢分組並將其一次發送到數據庫。 – sl3dg3 2012-04-26 11:42:02

+0

也許/可能不是,如果您沒有使用您引用的所有集合,例如您檢索1000條評論,但只顯示前25條評論,您將不必要地加載數據。對於數據庫而言,有很多參數的查詢「可能」會比一些較小的查詢更難。這就是爲什麼我建議設置測試 – Rippo 2012-04-26 12:15:36

+0

啊 - 我想如果我定義lazy =「true」,如果數據在代碼中沒有被訪問,批量大小不會觸發任何東西?我不希望Hinbernate在不必要的情況下加載任何東西... – sl3dg3 2012-04-26 12:28:34