Ich versuche, eine Einheit zu wählen und holen eine ähnliche Liste resultierende:NHibernate QueryOver mit Fetch mehrere SQL-Abfragen und db trifft
Session.QueryOver<UserRole>()
.Fetch(x => x.UsersInRole).Eager
.List();
was eine Menge von Datenbank-Hits. Die erste ist so etwas wie:
SELECT ... FROM UserRoles left outer join UsersInRoles on ...
und Hunderte weitere separate Abfragen, die so etwas wie folgt aussieht:
SELECT ... FROM UsersInRoles left outer join UserRoles on ... WHERE UserRoles.UserId=?
Die Abbildung ist, wie folgend:
public class UserRoleMap : ClassMap<UserRole>
{
public UserRoleMap()
{
Id(x => x.Id);
Map(x => x.RoleName);
HasManyToMany(x => x.UsersInRole)
.Inverse()
.LazyLoad()
.Table("UsersInRoles");
}
}
Versuchte Ihren Vorschlag. Hat sich in 1 + 12 Abfragen ergeben - VIEL besser als vorher, aber gibt es nicht einen Weg, um weniger als 12 zu machen? (Erhöhung der Batch-Größe?) - Was kostet die Batch-Größe? Ich würde sagen, wenn es alles gut wäre, wäre es standardmäßig eingestellt worden. Ist die Losgröße die einzige Lösung? Gibt es nicht einen möglichen Join, der zu 2 Abfragen führt? Wenn ich es nötig hätte, es mir selbst mit simpler SQL zu schreiben, wären 2 Anfragen ausreichend gewesen. Vielen Dank. –
Wenn es eine bessere Lösung als Losgröße gibt, bin ich mir vielleicht nicht sicher. Der Grund, warum dies nicht standardmäßig aktiviert ist, könnte die Tatsache sein, dass dies die einfache Logik sprengt: Das Proxy-Objekt für das Nicht-Initialisieren ist ein Treiber. Bei Bedarf greift es direkt auf seine Daten zu. Die Batch-Sizing verschiebt den Aufwand für die Sitzung, um diese SELECTS zu verbinden. Wie auch immer, Batch-Größe bezieht sich auf alle * unsere * Sammlungen und Klassenzuordnungen. Und die Leistung ist selbst bei großen Sets erstaunlich –