Czy mam rację mówiąc, że statystyki są używane tylko podczas tworzenia planu wykonania dla procedury składowanej i nie są używane w rzeczywistym kontekście wykonania?
Nie, zdarza się, że plan wykonania dla procedury składowanej jest buforowany. Zakładając, że dostępna jest wystarczająca ilość pamięci, aby kontynuować utrzymywanie planu, nie zmieni się, chyba że nastąpi jedna z poniższych sytuacji (od buforowania planu wykonania i ponownego użycia w dokumentacji programu SQL Server, podkreślenie dodane):
- Zmiany wprowadzone w tabeli lub widoku, do których odwołuje się zapytanie (ALTER TABLE i ALTER VIEW).
- Zmiany wprowadzone w pojedynczej procedurze, która spowoduje usunięcie wszystkich planów tej procedury z pamięci podręcznej (ALTER PROCEDURE).
- Zmiany w indeksach używanych przez plan wykonania.
- Aktualizacje statystyk używanych przez plan wykonania, generowane jawnie z instrukcji, takich jak UPDATE STATISTICS, lub generowane automatycznie.
- Usunięcie indeksu używanego przez plan wykonania.
- Wyraźne wywołanie do sp_recompile.
- Duża liczba zmian w kluczach (generowanych przez instrukcje INSERT lub DELETE od innych użytkowników, którzy modyfikują tabelę, do której odwołuje się zapytanie).
- W przypadku tabel z wyzwalaczami, jeśli liczba wierszy we wstawionych lub usuniętych tabelach znacznie wzrośnie.
- Wykonywanie procedury składowanej przy użyciu opcji Z RECOMPILE.
Jeśli więc statystyki zostaną zaktualizowane, buforowany plan automatycznie uwzględni nowe statystyki i zostanie ponownie skompilowany.
W jaki sposób zapobiegasz starzeniu się planów wykonania, gdy dziennie dodawanych jest sto tysięcy wierszy?
Jednym ze sposobów jest, jeśli istnieje wiele aktualizacji tabeli, jak wspomniano powyżej. Kilkaset tysięcy zmienionych rzędów może spełnić ten warunek. Ale jeśli chcesz mieć pewność lub mieć bardziej szczegółową kontrolę: aktualizując swoje statystyki. Możesz zezwolić SQL Serverowi na automatyczne tworzenie statystyk i zarządzanie nimi lub ręcznie zrobić to sam. Więcej informacji na temat obu metod można znaleźć w Automatycznej aktualizacji programu SQL Server i Opcjach automatycznego tworzenia statystyk . Kiedy / jeśli przeprowadzasz cotygodniową odbudowę indeksów, spowoduje to również aktualizację planów. Przeprowadź testy, aby zobaczyć, co jest dla Ciebie najbardziej korzystne, ponieważ zbyt częste aktualizowanie statystyk może nie przynieść żadnych rzeczywistych wyników.
Jeśli często aktualizujemy statystyki w celu rozwiązania tego problemu, czy warto zastosować wskazówkę OPCJE (RECOMPILE) w zapytaniu dotyczącym tej procedury składowanej?
Nie musisz go używać RECOMPILE
, ponieważ na podstawie powyższego fragmentu możesz zobaczyć, że plan wykonania jest odpowiednio aktualizowany, gdy dostępne są nowe statystyki. Może ci się przydać aktualizacja statystyk na koniec dnia (jeśli naprawdę się martwisz), ale nie sądzę, aby była to wyraźna potrzeba oparta na tym, co powiedziałeś do tej pory. Znowu jednak przetestowałbym to, aby zobaczyć, jaki może to mieć wpływ na wydajność procedury składowanej i odpowiednio zaplanowałem.
RECOMPILE
i tak nie spowodowałoby aktualizacji statystyk.