Wir haben ein Datenraster, um Mitglieder Datensätze für unsere Kunden anzuzeigen. Wir wurden kürzlich damit beauftragt, unsere Anwendung um Paging zu erweitern, so dass unsere großen Kunden (500.000+ Mitglieder).fließende Nhibernate-Abfrage dauert eine lange Zeit, um eine zugeordnete Formel mit Paging zu sortieren
Unsere Tabelle, aus der wir die Daten entnehmen, hat 10 Spalten. Wenn unsere Daten in unsere Anwendung ziehen fügten wir drei zusätzliche Spalten, die alle berechneten Felder sind
dh
SELECT SUM(tableX.Cost) FROM tableX WHERE tableX.ID = this_.ID
wo „this_“ ist der Alias für unsere Mitglieder Tisch und TableX stellt die andere Tabelle, die wir brauchen, um Grab Daten von.
In unserer Abfrage müssen wir bieten die Möglichkeit, die Spalten zu bestellen, aber ich habe festgestellt, dass, wenn ich versuche, die berechneten Felder zu bestellen, dass es eine erhebliche Menge an Zeit im Vergleich zu, wenn ich ORDER BY eine Spalte in Der Tisch. Dies macht zwar Sinn, dass es länger dauert, aber wenn es nur ein paar Minuten dauert, um nur 1000 Datensätze zu laden, wird es mehr als 500 Seiten geben. Dann fühle ich, dass das Ausrufen sinnlos macht.
Ich habe ein bisschen in vielleicht einen Second-Level-Cache mit Nhibernate, aber aus was ich bisher gelesen habe ich bin mir nicht sicher, ob dieses Problem lösen wird.
Durch die Art und Weise eine der Karten ist:
Map(x => x.Cost)
.Formula(@"(SELECT SUM(_Claims.Cost) FROM _Claims WHERE _Claims.ID = this_.ID")
.Nullable();
und für die Abfrage
var list = CurrentSession()
.SetFirstRsult(startPos)
.SetMaxResults(1000)
.SetTimeout(100)
.Add(Restrictions.Eq("ClientID", _clientID));
if(isASC)
{
list.AddOrder(Order.Asc(Projetions.Property(_propertyString)));
}
else
{
list.AddOrder(Order.Desc(Projetions.Property(_propertyString)));
}
return list.List<Member>();
ich die Ideen für diese ausgeführt wird. Wenn uns also jemand in die richtige Richtung weist, würde ich das sehr schätzen.
Dank
Können Sie eine Ansicht für Ihre berechneten Felder erstellen? Es klingt wie beim Sortieren, indem das Recordset heruntergefahren wird, die berechneten Felder zugeordnet und hinzugefügt werden und dann auf dem Client sortiert wird. Das Erstellen einer Ansicht würde sicherstellen, dass Sie auf dem Server sortieren. – jlnorsworthy
Ich glaube, dass es auf dem Server basierend auf der Abfrage sortiert, die NHibernate generiert. Ich denke, ich bin mir nicht sicher, wie es auf dem Client sein könnte, weil ich nicht denke, NH würde ~ 500.000 Datensätze greifen und sortieren dann die Top 1000 Datensätze zwischen den Reihen X und Y. – CSMHowitzer
Auch Blick auf Ihren Vorschlag Vorschlag ich don Ich denke, das ist eine ideale Lösung, denn das würde bedeuten, dass wir für jeden einzelnen unserer Kunden einen Überblick haben müssen, da wir einen Parameter nicht in eine Ansicht übertragen können. Wieder denke ich, dass es auf dem Server sortiert ist. – CSMHowitzer