首頁 >資料庫 >mysql教程 >為什麼 NHibernate QueryOver 與 Eager Fetching 會產生多個 SQL 查詢?

為什麼 NHibernate QueryOver 與 Eager Fetching 會產生多個 SQL 查詢?

Susan Sarandon
Susan Sarandon原創
2025-01-05 16:13:45545瀏覽

Why Does NHibernate QueryOver with Eager Fetching Generate Multiple SQL Queries?

NHibernate QueryOver with Fetch 導致多個SQL 查詢

查詢問題:

使用時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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn