Celowość użycia STATISTICS_NORECOMPUTE

9

Ostatnio zaangażowałem się w utrzymywanie zestawu baz danych z interesującymi problemami z indeksem. Jednym z tych, które najbardziej mnie denerwują, są różnice w indeksach między maszynami do programowania, testowania, modelowania i produkcji. Ponieważ różnice sprawiają, że strojenie zapytań jest dość trudne, ich synchronizacja jest jednym z moich pierwszych projektów.

Podczas porównywania środowisk testowych i modelowych zauważyłem, że większość indeksów w środowisku modelowym STATISTICS_NORECOMPUTEustawiła się na wartość, ONpodczas gdy te w testach nie. We wszystkich środowiskach istnieje nocne zadanie, które aktualizuje statystyki wszystkich baz danych.

Nigdy wcześniej się nie zajmowałem, STATISTICS_NORECOMPUTEwięc oto moje pytania. Czy są jakieś najlepsze praktyki dotyczące tego ustawienia? Jeśli robię aktualizacje statystyk na koniec dnia, czy najlepiej jest włączyć STATISTICS_NORECOMPUTEwszystkie środowiska we wszystkich indeksach? Czy jest dobry powód, aby tego nie robić?

EDYCJA: Znalazłem jeden z blogów Kimberly Tripp na ten temat , który wydaje się sugerować, że STATISTICS_NORECOMPUTEnależy go używać w najlepszym wypadku oszczędnie. Ale nadal jestem zaniepokojony globalnym wyłączeniem. Czy ktoś tego próbował i czego doświadczył?

Kenneth Fisher
źródło
Musisz uwierzyć w tę aplikację. Niektóre tabele mają dziesiątki indeksów, niektóre nie mają żadnych, kilka ma wiele duplikatów. To prawdziwy bałagan. Jakieś ogólne wytyczne? Jakieś miejsce na czytanie?
Kenneth Fisher
1
Jednym dobrym przypadkiem byłoby użycie STATISTICS_NORECOMPUTE = ON i FILLFACTOR = 100 dla tabel odnośników tylko do odczytu, które są zmieniane tylko przez DBA za pomocą skryptu, który wykonuje ODBUDOWANIE INDEKSU z FULLSCAN po zmianach; wtedy tabela jest w optymalnym kształcie z optymalnymi statystykami i bez żadnych innych zmian, nie ma powodu, aby nawet rozważać ponowne obliczenie statystyk lub pozostawienie miejsca na zmniejszenie podziałów stron na przyszłe zmiany.
Anty-słabe hasła

Odpowiedzi:

4

To naprawdę sytuacja, na którą chcesz spojrzeć na tabelę lub indeks, i naprawdę musisz dowiedzieć się, co jest w produkcji przed podjęciem jakichkolwiek działań. W razie wątpliwości używaj tego, co jest w produkcji, również w innych środowiskach, nawet jeśli oznacza to użycie szalonych ustawień. Po prostu nie możesz dobrze się zorientować, jak będzie się zachowywać produkcja, jeśli sprawy będą się różnić w testach lub projektach.

W każdym razie ogólne zalecenie pozostawienia włączonych statystyk automatycznej aktualizacji ( STATISTICS_NORECOMPUTE = OFFco jest ustawieniem domyślnym) jest ze względów bezpieczeństwa, ponieważ jeśli jest wyłączone i nic nie aktualizuje statystyk ręcznie, wynikiem mogą być naprawdę przerażające plany wykonania, które nigdy się nie zmieniają po pierwszym utworzeniu (i nie unieważnij ich z innych powodów).

Mówiłeś statystyki auto Update jest wyłączony dla większości indeksów (myślę, że pierwotnie misread jak wszyscy , nie najbardziej ). Czy w przypadku indeksów z włączonymi statystykami automatycznej aktualizacji to ustawienie ma sens, biorąc pod uwagę aktywność na tych tabelach? Spodziewałbym się, że są to tabele o wyższej aktywności. Możliwe, że dużo pracy włożono w ustalenie tego i może warto zachować (lub mocno rozważyć) te ustawienia. Przynajmniej zanotuj te statystyki, ponieważ informacje te mogą się przydać na drodze.

Myśląc o tym więcej, powiem, że obecna strategia ma sens. Czy to jest lepsze niż pozostawienie statystyk automatycznych aktualizacji dla wszystkiego? Wydaje się, że ktoś tak uważał, do tego stopnia, że ​​warta była łatwości zarządzania kompromisem posiadania powiązanego zadania SQL Agent.

Jeśli chodziło o to, aby mieć dostępne nowe statystyki bez blokowania zapytań (tak jak to ), możesz rozważyć ponowne włączenie automatycznej aktualizacji dla wszystkiego, a następnie również włączyć AUTO_UPDATE_STATISTICS_ASYNC. Następnie prawdopodobnie zmień harmonogram zadań, aby uruchamiał się raz w tygodniu zamiast codziennie, ponieważ nadal chcesz WITH FULLSCANokresowo aktualizować statystyki .

Mogę to jednak zostawić, ponieważ prawdopodobnie masz większe ryby do smażenia, jeśli same indeksy różnią się w zależności od środowiska, a odbudowywanie statystyk nie jest zbyt bolesne. To, co jest teraz, ma sens; musisz tylko zapewnić spójność w różnych środowiskach. Jest to prawdopodobnie nieznacznie lepsze niż prostsze ustawienia, które zasugerowałem, kosztem większej ilości pracy. Ale dowiedz się, co jest w produkcji, zmierz się do korzystania z tego i przejdź do ważniejszych rzeczy; powróć do tego, gdy potrzebujesz dokładniej dostroić wydajność - najlepsze statystyki na świecie nie zapisają zapytania, w którym brakuje indeksu krytycznego.

Jon Seigel
źródło
Ups ... Myślałem, że nie przesyłam tego komentarza.
swasheck