Ich versuche zu verstehen, wie die Stichprobenerfassung für Statistiken funktioniert und ob das folgende Verhalten bei Stichprobenaktualisierungen für Stichproben erwartet wird.
Wir haben eine große Tabelle, die nach Datum unterteilt ist und einige Milliarden Zeilen enthält. Das Partitionsdatum ist das vorherige Geschäftsdatum, ebenso wie ein aufsteigender Schlüssel. Wir laden nur Daten für den Vortag in diese Tabelle.
Das Laden der Daten läuft über Nacht, daher haben wir am Freitag, dem 8. April, Daten für den 7. April geladen.
Nach jedem Lauf aktualisieren wir die Statistiken, nehmen jedoch eine Stichprobe und nicht eine FULLSCAN
.
Vielleicht bin ich naiv, aber ich hätte erwartet, dass SQL Server den höchsten und niedrigsten Schlüssel im Bereich identifiziert, um sicherzustellen, dass er ein genaues Bereichsbeispiel erhält. Nach diesem Artikel :
Für den ersten Bucket ist die untere Grenze der kleinste Wert der Spalte, auf der das Histogramm generiert wird.
Der letzte Bucket / größte Wert wird jedoch nicht erwähnt.
Mit der Aktualisierung der Stichprobenstatistik am Morgen des 8. verfehlte die Stichprobe den höchsten Wert in der Tabelle (den 7.).
Da wir viele Daten vom Vortag abfragen, führte dies zu einer ungenauen Kardinalitätsschätzung und einer Reihe von Abfragen, bei denen das Zeitlimit überschritten wurde.
Sollte SQL Server nicht den höchsten Wert für diesen Schlüssel identifizieren und diesen als Maximum verwenden RANGE_HI_KEY
? Oder ist dies nur eine der Grenzen des Updates ohne Verwendung FULLSCAN
?
Version SQL Server 2012 SP2-CU7. Wir können derzeit kein Upgrade durchführen, da sich das OPENQUERY
Verhalten in SP3 geändert hat und die Zahlen in einer Verbindungsserverabfrage zwischen SQL Server und Oracle abgerundet wurden.