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_NORECOMPUTE
ustawiła się na wartość, ON
podczas 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_NORECOMPUTE
wię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_NORECOMPUTE
wszystkie ś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_NORECOMPUTE
należ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ł?
źródło
Odpowiedzi:
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 = OFF
co 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 chceszWITH FULLSCAN
okresowo 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.
źródło