NHibernate QueryOver 中的急切載入會導致多個資料庫查詢
使用NHibernate QueryOver 執行急切取得相關清單時,可能會導致在多個資料庫查詢中。這可能會導致資料庫流量顯著增加並降低效能。
考慮以下場景:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
此查詢嘗試選擇 UserRoles 集合並急切獲取相關的 UsersInRole。但是,這會導致多個單獨的資料庫查詢:
多重原因查詢
NHibernate 使用批次取得來有效地擷取相關實體。然而,當相關實體的數量超過批量大小時,就需要額外的查詢。在上述場景中,批次大小可能太小,無法在一次查詢中擷取所有 UsersInRole。
解決方案:調整批量大小
要解決此問題,您可以調整用於急切獲取的批量大小。透過設定更大的批次大小,NHibernate 將嘗試在單一查詢中取得更多相關實體。這可以顯著減少資料庫命中數。
如下修改對應:
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { ... HasManyToMany(x => x.UsersInRole) ... .BatchSize(25); } }
將批次大小設為 25 將指示 NHibernate 每個查詢最多取得 25 個 UsersInRole 實體。這可能會減少查詢並提高效能。
其他注意事項
以上是為什麼NHibernate QueryOver的預先載入會導致多次資料庫查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!