Bei der SQL Server-Beispielaktualisierung der Statistik fehlt der höchste RANGE_HI_KEY in der aufsteigenden Schlüsselspalte

10

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.).

Geben Sie hier die Bildbeschreibung ein

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 OPENQUERYVerhalten in SP3 geändert hat und die Zahlen in einer Verbindungsserverabfrage zwischen SQL Server und Oracle abgerundet wurden.

Mark Sinkinson
quelle

Antworten:

11

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?

Dies ist eine Einschränkung der aktuellen Implementierung von Stichprobenstatistiken. Derzeit wird die Stichprobenerfassung verwendet TABLESAMPLE SYSTEM, bei der ein Scan in Zuordnungsreihenfolge verwendet wird und Seiten aus dem Scan zum Abtasten ausgewählt werden. Nur ausgewählte Seiten tragen zum Histogramm bei.

Da der Scan nach Zuordnung (und nicht nach Index) sortiert ist, können die erste und die letzte Seite nicht in Schlüsselreihenfolge bevorzugt werden.

Weitere Informationen finden Sie in dieser verwandten Frage:

Wie funktioniert die Stichprobe beim Aktualisieren von Statistiken?

und mein Artikel Allocation Order Scans

Problemumgehungen finden Sie unter Statistiken zu aufsteigenden Spalten von Fabiano Amorim

Paul White 9
quelle