Der Kontext ist eine Transaktionstabelle mit Datum und UserAccount. Diese Tabelle enthält ungefähr Milliarden Zeilen.Wie eine Zeile pro Schlüssel in linken äußeren Join erhalten
dOperationValueDate sUserAccount
------------------- ----------------------------------------------
2016-03-05 00000000001
2016-03-06 00000000002
2016-03-07 00000000003
2016-03-08 00000000004
2016-03-09 00000000005
2016-04-05 00000000002
2016-10-05 00000000001
2016-10-06 00000000001
2016-10-06 00000000005
Ich mag würde mit diesen Kriterien auf Daten in meiner Tabelle finden:
- Mindestens eine Transaktion vor vor 6 Monaten (wie TOP 1 *)
- Keine Transaktion für 6 Monate
In meinem Beispiel würde die Ergebnisse Konten 2, 3, 4 sein
ich mit gestartet ein LEFT OUTER JOIN, um alle userId mit Transaktion seit 6 Monaten zu entfernen. Aber die Bearbeitungszeit ist einfach schrecklich: für 4 Stunden gerade jetzt.
Ich denke, die Lösung besteht darin, nur eine Operation in der b-Abfrage zu finden, und sql stoppt, wenn eine Zeile gefunden wird. Das Hauptproblem ist nur, wenn der Benutzer vor 6 Monaten keine Transaktion hat, aber für die anderen wird es in Ordnung sein.
Auf der anderen Seite muss ich jede Transaktion seit 6 Monaten überprüfen, um Kunden aus dem Anwendungsbereich zu entfernen.
Ich las über Cross APPLY, aber ich bin mir nicht sicher, wie es funktioniert.
Das Hauptproblem ist hier die Bearbeitungszeit. Ich muss eine "schnelle" Anfrage (weniger als 1 Stunde) machen.
Hier ist ein großartiger Ort, um zu beginnen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Haben Sie zufällig einen einzigen Index aus 'sUserAccount' und' dOperationValueDate' (in dieser Reihenfolge)? (Sind diese faux-ungarische Notation Spalte Namen?) – HABO