Ich habe eine Basistabelle mit Transaktionen und muss eine Tabelle mit laufenden Summen erstellen. Ich brauche sie pro Konto und habe auch ein paar laufende Summen für jedes Konto (abhängig vom Transaktionstyp) und darin einige laufende Summen pro Unterkonto.
Meine Basistabelle enthält folgende Felder (mehr oder weniger):
AccountID | SubAccountID | TransactionType | TransactionAmount
Wenn man bedenkt, dass ich ungefähr 4 Arten von laufenden Summen pro Konto / Transaktionstyp und 2 weitere laufende Summen pro Konto / Unterkonto / Transaktionstyp habe, habe ich ungefähr 2 Millionen Konten mit jeweils ungefähr 10 Unterkonten und ich bekomme ungefähr 10.000 Transaktionen Wie würden Sie es jede Minute (bei maximaler Belastung) tun?
Es ist auch ein Muss, dass dies asynchron über einen SQL-Job ausgeführt wird und die Aggregationen erstellt werden, ohne Teil der Transaktionen selbst zu sein.
Ich stecke hier ziemlich fest mit einem Cursor - was viel zu lange dauert. Ich würde mich über Ratschläge / Artikel sehr freuen, die mehr oder weniger dasselbe tun.
quelle
Antworten:
Asynchron bedeutet, dass die laufenden Summen nicht immer vollständig genau sein müssen, oder dass Ihre Datenänderungsmuster so sind, dass ein einmaliger laufender Gesamtaufbau bis zum nächsten Laden gültig und genau ist. Wie auch immer, ich bin sicher, Sie haben diesen Teil durchdacht, also werde ich mich nicht darum kümmern.
Ihre Hauptoptionen für eine leistungsstarke, unterstützte Methode sind eine SQLCLR-Funktion / -Prozedur oder eine
UPDATE
auf der satzbasierten Iterationsmethode von Hugo Kornelis basierende. Die SQLCLR-Methode (in einer Prozedur implementiert, aber relativ einfach zu übersetzen) finden Sie hier .Ich konnte Hugos Methode nicht online finden, aber sie ist in den hervorragenden MVP Deep Dives (Band 1) beschrieben. Der folgende Beispielcode zur Veranschaulichung der Hugo-Methode (kopiert von einem meiner Beiträge auf einer anderen Website, für die Sie möglicherweise kein Login haben) ist unten dargestellt:
In SQL Server 2012 können Sie die Fensterfunktionserweiterungen verwenden, z
SUM OVER (ORDER BY)
.quelle
Ich bin mir nicht sicher, warum Sie asynchron sein möchten, aber ein paar indizierte Ansichten klingen hier wie das Ticket. Wenn Sie eine einfache SUMME für eine Gruppe wünschen, definieren Sie: Laufende Summe definieren.
Wenn Sie wirklich asynchron sein möchten, sind Ihre laufenden Summen mit 160 neuen Zeilen pro Sekunde immer veraltet. Asynchron würde keine Trigger oder indizierten Ansichten bedeuten
quelle
Die Berechnung laufender Summen ist notorisch langsam, egal ob Sie dies mit einem Cursor oder mit einer dreieckigen Verknüpfung tun. Es ist sehr verlockend, laufende Summen zu denormalisieren und in einer Spalte zu speichern, insbesondere wenn Sie sie häufig auswählen. Wie üblich beim Denormalisieren müssen Sie jedoch die Integrität Ihrer denormalisierten Daten gewährleisten. Glücklicherweise können Sie die Integrität laufender Summen mit Einschränkungen garantieren. Solange alle Ihre Einschränkungen vertrauenswürdig sind, sind alle laufenden Summen korrekt.
Auf diese Weise können Sie auch leicht sicherstellen, dass der aktuelle Kontostand (laufende Summen) niemals negativ ist. Die Durchsetzung durch andere Methoden kann ebenfalls sehr langsam sein. Das folgende Skript demonstriert die Technik.
Von meinem Blog kopiert
quelle