Abfrageproblem:
Bei der Verwendung Wenn QueryOver eine Themenliste mithilfe von Eager Loading abruft, treten mehrere Datenbanktreffer auf, was zu zahlreichen separaten SQL-Anweisungen führt Abfragen.
Beispiel:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
Erklärung:
Dieses Verhalten ist auf die Natur von Many-to zurückzuführen -viele Beziehungen. In der Beispielzuordnung hat eine UserRole-Entität eine Viele-zu-Viele-Beziehung mit UsersInRole-Entitäten. Wenn Eager Loading verwendet wird, versucht NHibernate, alle zugehörigen UsersInRole-Entitäten für jede abgerufene UserRole-Entität zu laden.
Da die Sitzung jedoch möglicherweise noch nicht alle zugehörigen Entitäten enthält, werden mehrere SQL-Abfragen ausgegeben, um diese Beziehungen abzurufen. Die erste Abfrage ruft die UserRole-Entitäten ab, und nachfolgende Abfragen werden für jede UserRole ausgegeben, um die zugehörigen UsersInRole-Entitäten abzurufen.
Lösung:
Eine effektive Lösung zur Minimierung von SQL-Abfragen besteht darin, Batch-Abruf zu verwenden. Durch Festlegen der BatchSize-Eigenschaft für die HasManyToMany-Zuordnung kann NHibernate mehrere verwandte Entitäten in einer einzigen SQL-Abfrage abrufen.
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
Durch Festlegen der Batch-Größe auf einen geeigneten Wert (z. B. 25) gibt NHibernate eine aus Begrenzte Anzahl von SQL-Abfragen, wodurch die Gesamtzahl der Datenbanktreffer reduziert und die Leistung verbessert wird.
Darüber hinaus kann auch das Festlegen der Stapelgröße in der Klassenzuordnung hilfreich sein Optimieren Sie die allgemeine Abrufstrategie.
Das obige ist der detaillierte Inhalt vonWarum generiert NHibernate QueryOver mit Eager Fetching mehrere SQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!