Heim >Datenbank >MySQL-Tutorial >Warum verursacht NHibernate QueryOver mit Fetch mehrere Datenbankabfragen und wie kann ich es optimieren?
NHibernate QueryOver mit Fetch verursacht mehrere Abfrageausführungen
Das Ausführen eines QueryOver mit einer Fetch-Klausel zum Abrufen einer übergeordneten Entität und ihrer untergeordneten Sammlung führt häufig dazu in übermäßigen Datenbankzugriffen. Dieses Verhalten tritt auf, weil NHibernate eine separate Abfrage für jede Zeile in der untergeordneten Sammlung ausgibt.
Um dies zu verstehen, betrachten Sie ein Szenario mit einer UserRole-Entität und einer UsersInRole-Sammlung. Die erste Abfrage ruft die UserRole-Entitäten ab:
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
Für jede abgerufene UserRole führt NHibernate dann eine separate Abfrage aus, um die UsersInRole-Sammlung abzurufen, was zu zahlreichen Abfragen im Format führt:
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
Um dieses Verhalten zu optimieren, ermöglicht NHibernate das Festlegen einer BatchSize-Eigenschaft für HasManyToMany Zuordnung:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
Durch Angabe dieser Option lädt NHibernate die untergeordnete Sammlung in Stapeln und reduziert so die Anzahl der Datenbankabfragen auf maximal 1 (Stapelgröße / Seitengröße). Dies gewährleistet einen effizienten Abruf verwandter Daten und vermeidet gleichzeitig übermäßige Datenbankzugriffe.
Das obige ist der detaillierte Inhalt vonWarum verursacht NHibernate QueryOver mit Fetch mehrere Datenbankabfragen und wie kann ich es optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!