Wzór na szacowanie wierszy staje się trochę głupi, gdy filtr jest „większy niż” lub „mniejszy niż”, ale jest to liczba, do której można dojść.
Liczby
Korzystając z kroku 193, oto odpowiednie numery:
RANGE_ROWS = 6624
EQ_ROWS = 16
AVG_RANGE_ROWS = 16,1956
RANGE_HI_KEY z poprzedniego kroku = 1999-10-13 10: 47: 38.550
RANGE_HI_KEY z bieżącego kroku = 1999-10-13 10: 51: 19.317
Wartość z klauzuli WHERE = 1999-10-13 10: 48: 38.550
Formuła
1) Znajdź ms między dwoma klawiszami hi zakresu
SELECT DATEDIFF (ms, '1999-10-13 10:47:38.550', '1999-10-13 10:51:19.317')
Wynik to 220767 ms.
2) Dostosuj liczbę rzędów
Musimy znaleźć wiersze na milisekundę, ale zanim to zrobimy, musimy odjąć AVG_RANGE_ROWS od RANGE_ROWS:
6624 - 16,1956 = 6607,8044 wierszy
3) Oblicz liczbę wierszy na ms z dostosowaną liczbą wierszy:
6607,8044 wierszy / 220767 ms = .0299311 wierszy na ms
4) Oblicz ms między wartością z klauzuli WHERE a bieżącym krokiem RANGE_HI_KEY
SELECT DATEDIFF (ms, '1999-10-13 10:48:38.550', '1999-10-13 10:51:19.317')
To daje nam 160767 ms.
5) Oblicz rzędy w tym kroku na podstawie rzędów na sekundę:
.0299311 wierszy / ms * 160767 ms = 4811.9332 wierszy
6) Pamiętasz, jak wcześniej odjęliśmy AVG_RANGE_ROWS? Czas je dodać. Teraz, gdy zakończyliśmy obliczanie liczb związanych z rzędami na sekundę, możemy również bezpiecznie dodać EQ_ROWS:
4811.9332 + 16,1956 + 16 = 4844,1288
Zaokrąglając w górę, to jest nasz szacunek 4844,13.
Testowanie formuły
Nie mogłem znaleźć żadnych artykułów ani postów na blogu o tym, dlaczego AVG_RANGE_ROWS jest odejmowany przed obliczeniem wierszy na ms. I był w stanie potwierdzić, są one uwzględnione w szacunkach, ale dopiero w ostatniej milisekundy - dosłownie.
Korzystając z bazy danych WideWorldImporters , przeprowadziłem pewne testy przyrostowe i stwierdziłem, że zmniejszenie szacunków w wierszach jest liniowe do końca kroku, gdzie nagle uwzględnia się 1x AVG_RANGE_ROWS.
Oto moje przykładowe zapytanie:
SELECT PickingCompletedWhen
FROM Sales.Orders
WHERE PickingCompletedWhen >= '2016-05-24 11:00:01.000000'
Zaktualizowałem statystyki dla PickingCompletedWhen, a następnie otrzymałem histogram:
DBCC SHOW_STATISTICS([sales.orders], '_WA_Sys_0000000E_44CA3770')
Aby zobaczyć, jak szacowane rzędy zmniejszają się, gdy zbliżamy się do RANGE_HI_KEY, zbierałem próbki przez cały krok. Zmniejszenie jest liniowe, ale zachowuje się tak, jakby liczba wierszy równa wartości AVG_RANGE_ROWS po prostu nie była częścią trendu ... dopóki nie trafisz na RANGE_HI_KEY i nagle spadną one jak nieściągalny dług odpisany. Możesz to zobaczyć w przykładowych danych, szczególnie na wykresie.
Zwróć uwagę na stały spadek wierszy, dopóki nie trafimy w RANGE_HI_KEY, a następnie BOOM, że ostatnia część AVG_RANGE_ROWS jest nagle odejmowana. Łatwo jest też zauważyć na wykresie.
Podsumowując, nieparzyste traktowanie AVG_RANGE_ROWS sprawia, że obliczanie oszacowań wierszy jest bardziej złożone, ale zawsze można pogodzić to, co robi CE.
Co z wykładniczym wycofaniem?
Wykładnicze wycofanie to metoda, którą nowy (od SQL Server 2014) Szacunek liczności służy do uzyskiwania lepszych szacunków przy użyciu wielu statystyk jednokolumnowych. Ponieważ pytanie dotyczyło jednej statystyki jednokolumnowej, nie wymaga formuły EB.