Najwyższe poziomy planu dotyczą usuwania wierszy z tabeli podstawowej (indeks klastrowany) i utrzymywania czterech indeksów nieklastrowanych. Dwa z tych indeksów są utrzymywane wiersz po wierszu w tym samym czasie, gdy przetwarzane są skasowane indeksy. Są to „+2 indeksy nieklastrowane” podświetlone na zielono poniżej.
W przypadku pozostałych dwóch indeksów nieklastrowanych optymalizator zdecydował, że najlepiej zapisać klucze tych indeksów w stole roboczym tempdb (bufor Eager), a następnie dwukrotnie odtworzyć bufor, sortując według kluczy indeksu, aby promować sekwencyjny wzór dostępu.
Ostatnia sekwencja operacji dotyczy utrzymywania xml
indeksów pierwotnego i wtórnego , które nie zostały uwzględnione w skrypcie DDL:
Niewiele można z tym zrobić. Indeksy i xml
indeksy nieklastrowane muszą być zsynchronizowane z danymi w tabeli podstawowej. Koszt utrzymania takich indeksów jest częścią kompromisu, jaki podejmujesz, tworząc dodatkowe indeksy na stole.
To powiedziawszy, xml
indeksy są szczególnie problematyczne. Optymalizatorowi bardzo trudno jest dokładnie oszacować, ile wierszy zostanie zakwalifikowanych w tej sytuacji. W rzeczywistości znacznie zawyżono szacunki dla xml
indeksu, co spowodowało przyznanie prawie 12 GB pamięci dla tego zapytania (choć w czasie wykonywania jest używane tylko 28 MB):
Możesz rozważyć usunięcie w mniejszych partiach, mając nadzieję na ograniczenie wpływu nadmiaru pamięci.
Możesz także przetestować wydajność planu bez użycia metod OPTION (QUERYTRACEON 8795)
. Jest to nieudokumentowana flaga śledzenia, więc powinieneś wypróbować ją tylko w systemie rozwojowym lub testowym, nigdy w produkcji. Jeśli wynikowy plan jest znacznie szybszy, możesz przechwycić XML planu i użyć go do utworzenia Przewodnika po planach dla zapytania produkcyjnego.