Histogram statystyk AVG_RANGE_ROWS Rozbieżność

Sep 28 2020

Według dokumentacji MS opis AVG_RANGE_ROWSjest następujący:

Średnia liczba wierszy ze zduplikowanymi wartościami kolumn w kroku histogramu, z wyłączeniem górnej granicy. Gdy DISTINCT_RANGE_ROWS jest większe niż 0, AVG_RANGE_ROWS jest obliczane przez podzielenie RANGE_ROWS przez DISTINCT_RANGE_ROWS. Gdy DISTINCT_RANGE_ROWS wynosi 0, AVG_RANGE_ROWS zwraca 1 dla kroku histogramu.

Patrzę na ostatnią linię i jeśli tak jest, jestem ciekawy, dlaczego widzę wartość, AVG_RANGE_ROWSktóra nie jest równa, 1gdy DISTINCT_RANGE_ROWSjest 0w krokach histogramu.

Statystyka, o której mowa, to statystyka kolumny utworzona przez SQL Server, gdy opcja automatycznego tworzenia statystyk jest włączona. Jestem na starszej wersji bazy danych, ale na najnowszej poprawce - SQL Server 2014 SP3, CU4 + GDR (12.0.6372.1).

Trochę to niefortunne, że w zeszłym tygodniu prawie doszło do załamania z powodu nieoptymalnego planu zapytań. Efektem końcowym były duże skany i rozdęte przydziały pamięci. Ponowne próbkowanie statystyki z wyższą wartością procentową rozwiązało na razie problem, ale jestem głównie ciekawy, czy są wyjątki wokół początkowej instrukcji lub znany problem (być może rozwiązany za pomocą flagi śledzenia?) I jak Czy mogę zapobiec temu powtórzeniu się w przypadku statystyk tworzonych automatycznie, w przypadku których nie mamy kontroli nad rozmiarem próbkowania?

Odpowiedzi

6 PaulWhite Sep 28 2020 at 13:41

Jak opisano w odpowiedzi na temat Nieprawidłowo uformowany histogram powoduje złe oszacowania w pętli zagnieżdżonej, nastąpiła zmiana w sposobie obliczania i przechowywania próbkowanych statystyk, w szczególności w przypadku stosowania skalowania.

Jako efekt uboczny, wartość dla DISTINCT_RANGE_ROWSw twoim przypadku jest ułamkiem między 0 a 1 (980,235 / 386212,6 = 0,002538071). Kolumna ma wyeksponowany typ bigint, więc jest zaokrąglana w dół do zera.

Oczywiście nie może istnieć zero odrębnych wartości, gdy zakres zawiera niezerową liczbę wierszy.

Można mieć tylko nadzieję, że te rozbieżności zostaną na pewnym etapie wyjaśnione; chociaż trudno sobie dokładnie wyobrazić, jak to mogłoby wyglądać bez potencjalnie zepsutej zmiany typu danych, rozszerzonej również na sys.dm_db_stats_histogram(dostępne w SQL Server 2016 i nowszych).

Jeśli chodzi o to, co z tym zrobisz, jeśli jesteś przekonany, że nie jest to tylko problem z wyświetlaniem i faktycznie powoduje złe szacunki, powinieneś zgłosić to jako regresję.