Statistikhistogramm AVG_RANGE_ROWS Diskrepanz
Laut MS-Dokumenten AVG_RANGE_ROWSlautet die Beschreibung für :
Durchschnittliche Anzahl von Zeilen mit doppelten Spaltenwerten innerhalb eines Histogrammschritts ohne die Obergrenze. Wenn DISTINCT_RANGE_ROWS größer als 0 ist, wird AVG_RANGE_ROWS berechnet, indem RANGE_ROWS durch DISTINCT_RANGE_ROWS geteilt wird. Wenn DISTINCT_RANGE_ROWS 0 ist, gibt AVG_RANGE_ROWS 1 für den Histogrammschritt zurück.
Ich freue mich auf die letzte Zeile und wenn das tatsächlich der Fall ist, ich bin neugierig zu wissen , warum ich Wert bin zu sehen für AVG_RANGE_ROWSdas nicht gleich , 1wenn DISTINCT_RANGE_ROWSist 0in den Histogrammschritten.
Bei der fraglichen Statistik handelt es sich um eine Spaltenstatistik, die von SQL Server erstellt wird, wenn die Option zum automatischen Erstellen von Statistiken aktiviert ist. Ich bin auf einer älteren Version der Datenbank, aber auf dem neuesten Patch - SQL Server 2014 SP3, CU4 + DDR (12.0.6372.1).
Es ist ein bisschen bedauerlich, dass wir letzte Woche wegen eines nicht optimalen Abfrageplans fast einen Zusammenbruch hatten. Das Endergebnis waren große Scans und aufgeblähte Speicherzuweisungen. Durch erneutes Abtasten der Statistik mit einem höheren Prozentwert wurde das Problem vorerst für uns behoben, aber ich bin meistens gespannt, ob und wie Ausnahmen um die ursprüngliche Anweisung oder ein bekanntes Problem (möglicherweise mithilfe eines Ablaufverfolgungsflags behoben?) Enthalten sind Verhindere ich, dass dies bei automatisch erstellten Statistiken erneut auftritt, bei denen wir keine Kontrolle über die Stichprobengröße haben?
Antworten
Wie in der Antwort auf ein falsch geformtes Histogramm beschrieben, das zu schlechten Schätzungen für verschachtelte Schleifen führt, wurde die Art und Weise, wie Stichprobenstatistiken berechnet und gespeichert werden, geändert, insbesondere wenn die Skalierung angewendet wird.
Als Nebeneffekt ist der Wert für DISTINCT_RANGE_ROWSin Ihrem Fall ein Bruchteil zwischen 0 und 1 (980.235 / 386212.6 = 0.002538071). Die Spalte hat einen exponierten Typ von bigint, daher wird sie auf Null abgerundet.
Es ist klar, dass es keine eindeutigen Nullwerte geben kann, wenn der Bereich eine Anzahl von Zeilen ungleich Null enthält.
Man kann nur hoffen, dass diese Unstimmigkeiten irgendwann behoben werden; Es ist jedoch schwer vorstellbar, wie das genau aussehen könnte, ohne dass sich der Datentyp möglicherweise grundlegend ändert. Dies gilt auch für sys.dm_db_stats_histogram(verfügbar unter SQL Server 2016 und höher).
Wenn Sie davon überzeugt sind, dass dies nicht nur ein Anzeigeproblem ist und tatsächlich zu schlechten Schätzungen führt, sollten Sie dies als Regression melden.