查詢問題:
使用時QueryOver使用預先載入來取得相關列表,會發生多次資料庫命中,導致大量單獨的SQL 查詢。
例如:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
說明:
此行為是由於許多原因造成的 -對多關係。在範例對應中,UserRole 實體與 UsersInRole 實體具有多對多關係。當使用預先載入時,NHibernate 會嘗試為每個擷取的 UserRole 實體載入所有相關的 UsersInRole 實體。
但是,由於會話可能尚未包含所有相關實體,因此會發出多個 SQL 查詢來檢索這些關係。初始查詢會擷取 UserRole 實體,並為每個 UserRole 發出後續查詢以擷取其相關的 UsersInRole 實體。
解決方案:
一種最小化 SQL 查詢的有效解決方案就是使用批次抓取。透過在 HasManyToMany 映射上設定 BatchSize 屬性,NHibernate 可以在單一 SQL 查詢中取得多個相關實體。
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
透過將批次大小設定為適當的值(例如 25),NHibernate 將發出限制 SQL 查詢數量,減少資料庫總命中率並提高效能。
另外,在 Class 上設定批次大小地圖還可以幫助最佳化整體抓取策略。
以上是為什麼 NHibernate QueryOver 與 Eager Fetching 會產生多個 SQL 查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!