Histogram statystyk AVG_RANGE_ROWS Rozbieżność
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
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ę.