Mam 200 GB hurtowni danych w SQL Server.
Występują naprawdę powolne czasy wykonywania niektórych zapytań; na przykład 12 godzin na proste delete
zapytanie z inner join
.
Po przeprowadzeniu badań z planami wykonania zaktualizowałem statystyki 2 tabel biorących udział w zapytaniu, korzystając z tej WITH FULLSCAN
opcji.
Zapytanie jest teraz wykonywane w mniej niż sekundę, więc wygląda na to, że statystyki nie były aktualne.
Rozważam wyłączenie auto update statistics
w bazie danych i uruchomienie UPDATE STATISTICS
ręczne po załadowaniu hurtowni danych. Hurtownia danych jest ładowana stopniowo ze źródłowego systemu ERP codziennie, w nocy.
Czy mam rację, zakładając, że auto update statistics
scenariusze hurtowni danych nie są tak naprawdę przydatne? Czy zamiast tego sensowniej jest ręcznie aktualizować statystyki po załadowaniu danych?
Odpowiedzi:
Oto oficjalny dokument na temat automatycznej aktualizacji statystyk . Oto najważniejsze punkty w stosunku do automatycznych aktualizacji statystyk:
@JNK stwierdził w komentarzu, że jeśli masz 1 miliard wierszy w tabeli, musisz mieć 20 000 5 000 zapisów w pierwszej kolumnie statystyki, aby uruchomić aktualizację.
Weźmy następującą strukturę:
Teraz możemy sprawdzić, co się stało w lądowaniu statystyk.
Aby jednak sprawdzić, czy jest to znaczący obiekt statystyczny, musimy:
Ta statystyka nie została zaktualizowana. To dlatego, że wygląda na to, że statystyki nie są aktualizowane aż do
SELECT
wystąpienia, a nawet wtedySELECT
musi wykraczać poza to, co SQL Server ma na swoim histogramie. Oto skrypt testowy, który uruchomiłem, aby to przetestować:Zamiast ślepo wyłączać statystyki auto_update, spróbowałbym sprawdzić twój zestaw danych pod kątem przekrzywienia. Jeśli Twoje dane wykazują znaczące zniekształcenie, musisz rozważyć utworzenie filtrowanych statystyk, a następnie zdecydować, czy ręczne zarządzanie aktualizacjami statystyk jest właściwym działaniem.
Aby przeanalizować pochylenie, musisz uruchomić
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(w powyższym skrypcie bezWITH STAT_HEADER
) na określonej kombinacji statystyki / indeksu, którą chcesz sprawdzić. Szybkim sposobem na zerknięcie gałki ocznej byłoby spojrzenie na histogram (trzeci zestaw wyników) i sprawdzenie wariancjiEQ_ROWS
. Jeśli jest dość spójny, to pochylenie jest minimalne. Aby go zwiększyć, spójrz naRANGE_ROWS
kolumnę i spójrz na wariancję, ponieważ mierzy to, ile wierszy istnieje między każdym krokiem. Na koniec możesz pobrać[All density]
wynik zDENSITY_VECTOR
(drugiego zestawu wyników) i pomnożyć go przez[Rows Sampled]
wartość wSTAT_HEADER
(pierwszym zestawie wyników) i zobaczyć, jakie byłoby średnie oczekiwanie na zapytanie w tej kolumnie. Porównujesz tę średnią do swojejEQ_ROWS
a jeśli jest wiele miejsc, w których znacznie się różni, to masz przekrzywienie.Jeśli okaże się, że masz pochylenie, musisz rozważyć utworzenie filtrowanych statystyk dla zakresów, które mają wysokie bardzo wysokie
RANGE_ROWS
, abyś mógł podać dodatkowe kroki w celu uzyskania lepszych oszacowań tych wartości.Po zainstalowaniu filtrowanych statystyk możesz sprawdzić możliwość ręcznej aktualizacji statystyk.
źródło