Beim Zugriff auf historische Datensätze in einer Zeittabelle tritt ein seltsames Problem auf. Abfragen, die über die AS OF-Unterklausel auf die älteren Einträge in der Zeittabelle zugreifen, dauern länger als Abfragen zu aktuellen historischen Einträgen.
Die Verlaufstabelle wurde von SQL Server generiert (enthält einen Clustered-Index für die Datumsspalten und verwendet die Seitenkomprimierung). Ich habe der Verlaufstabelle 50 Millionen Zeilen hinzugefügt und meine Abfragen haben ungefähr 25.000 Zeilen abgerufen.
Ich habe versucht, die Grundursache des Problems zu ermitteln, konnte es jedoch nicht identifizieren. Bisher habe ich getestet:
- Erstellen einer Testtabelle mit 50 Millionen Zeilen mit einem Clustered-Index, um festzustellen, ob die Verlangsamung einfach auf das Volumen zurückzuführen ist. Ich konnte 25K Zeilen zu konstanter Zeit (~ 400ms) abrufen.
- Entfernen der Seitenkomprimierung aus der Verlaufstabelle. Dies hatte keinen Einfluss auf die Abrufzeit, erhöhte jedoch die Größe der Tabelle erheblich.
- Ich habe versucht, direkt auf die Zeilen der Verlaufstabelle zuzugreifen, indem ich eine ID-Spalte gegenüber den Datumsspalten verwendet habe. Hier waren die Dinge etwas interessanter. Ich konnte mit ~ 400 ms auf ältere Zeilen in der Tabelle zugreifen, wobei es wie bei der AS OF-Unterklausel ~ 1200 ms dauern würde. Ich habe versucht, in meiner Testtabelle in der Datumsspalte zu filtern, und habe eine ähnliche Verlangsamung im Vergleich zum Filtern in der ID-Spalte festgestellt. Dies lässt mich glauben, dass die Datumsvergleiche hinter einem Teil der Verlangsamung stecken.
Ich möchte mir das genauer ansehen, aber ich möchte auch sicherstellen, dass ich nicht den falschen Baum belle. Hat jemand anderes das gleiche Verhalten beim Zugriff auf ältere historische Daten in einer Zeittabelle festgestellt (wir haben nur festgestellt, dass Verlangsamungen 10 Millionen Zeilen überschritten haben)? Zweitens, mit welchen Strategien kann ich die Hauptursache des Leistungsproblems weiter eingrenzen (ich habe gerade angefangen, Ausführungspläne zu untersuchen, aber es ist für mich immer noch etwas kryptisch)?
Ausführungspläne
Dies sind einfache Abrufabfragen: Die erste greift auf ältere Zeilen zu, die zweite auf neuere Zeilen.
Ältere Zeilen ~ 1200 ms Ausführungszeit
Letzte Zeilen ~ 350 ms Ausführungszeit
Tabellendetails
Dies sind die Spalten in der Zeittabelle. Die Verlaufstabelle hat dieselben Spalten, jedoch keinen Primärschlüssel (gemäß den Anforderungen der Verlaufstabelle):
Nachfolgend sind die Indizes in der Verlaufstabelle aufgeführt:
quelle