Próbuję zrozumieć, w jaki sposób działa próbkowanie statystyk i czy poniżej oczekiwane jest zachowanie aktualizacji próbkowanych statystyk.
Mamy duży stół podzielony według dat z kilkoma miliardami wierszy. Data podziału jest wcześniejszą datą biznesową, podobnie jak klucz rosnący. Ładujemy dane do tej tabeli tylko z poprzedniego dnia.
Ładowanie danych trwa z dnia na dzień, więc w piątek 8 kwietnia załadowaliśmy dane z 7.
Po każdym uruchomieniu aktualizujemy statystyki, chociaż pobieramy próbkę zamiast FULLSCAN
.
Być może jestem naiwny, ale oczekiwałbym, że SQL Server zidentyfikuje najwyższy i najniższy klucz w zakresie, aby upewnić się, że uzyskał dokładną próbkę zakresu. Zgodnie z tym artykułem :
W pierwszym segmencie dolna granica jest najmniejszą wartością kolumny, na której generowany jest histogram.
Jednak nie wspomina o ostatnim segmencie / największej wartości.
Wraz z aktualizacją statystyk próbkowanych rano 8-go, próbka przeoczyła najwyższą wartość w tabeli (7-ta).
Ponieważ wykonujemy wiele zapytań dotyczących danych z poprzedniego dnia, spowodowało to niedokładne oszacowanie liczności i upłynął limit czasu wielu zapytań.
Czy SQL Server nie powinien identyfikować najwyższej wartości dla tego klucza i używać go jako wartości maksymalnej RANGE_HI_KEY
? Czy to tylko jeden z limitów aktualizacji bez użycia FULLSCAN
?
Wersja SQL Server 2012 SP2-CU7. Nie możemy obecnie dokonać aktualizacji ze względu na zmianę OPENQUERY
zachowania w dodatku SP3, która zaokrąglała liczby w zapytaniu do serwera połączonego między SQL Server a Oracle.