Usuwanie nieużywanych indeksów - Ocena nieoczekiwanych zagrożeń

16

Mamy bardzo dużą bazę danych z setkami nieużywanych indeksów zgodnie ze statystykami DMV, które gromadzą się od ostatniego restartu serwera w lipcu. Jeden z naszych DBA wydał następujące przestrogi, które nie mają dla mnie sensu:

  1. Przed upuszczeniem indeksu musimy upewnić się, czy nie wymusza on ograniczenia wyjątkowości, ponieważ optymalizator kwerend może potrzebować tego indeksu.
  2. Za każdym razem, gdy tworzony jest Indeks, statystyki związane z tym indeksem są również tworzone w SQL Server. Kwerenda może nie korzystać z indeksu, ale może wykorzystywać statystyki. Możemy więc spotkać się z sytuacją, gdy po upuszczeniu indeksu wydajność określonego zapytania jest naprawdę zła. SQL Server nie przechowuje statystyk użytkowania statystyk. Chociaż w naszej bazie danych jest włączona funkcja „Automatyczne tworzenie statystyk”, nie wiem, które wszystkie parametry muszą zostać spełnione wewnętrznie, zanim optymalizator zapytań utworzy brakujące statystyki.

Jeśli chodzi o nr 1, wydaje mi się, że SQL Server faktycznie szuka indeksu w celu ustalenia niepowtarzalności przed wykonaniem operacji wstawiania / aktualizacji, a zatem indeks nie byłby wyświetlany jako nieużywany.

Jeśli chodzi o # 2, czy to naprawdę możliwe?

Nawiasem mówiąc, kiedy mówię, że indeks nie jest używany, mam na myśli brak poszukiwań i skanów.

Randy Minder
źródło
3
Sugerowałbym wyłączenie indeksu, gdy masz absolutną pewność, że indeks ten nie jest używany, nawet przy uruchamianiu raportów na koniec roku.
Kin Shah,

Odpowiedzi:

17

Obawy twojego DBA są ważne.

Jeśli chodzi o nr 1, wydaje mi się, że SQL Server faktycznie szuka indeksu w celu ustalenia niepowtarzalności przed wykonaniem operacji wstawiania / aktualizacji, a zatem indeks nie byłby wyświetlany jako nieużywany.

Gwarancja unikatowości może być wykorzystana przez optymalizator przy podejmowaniu decyzji, które transformacje logiczne lub operacje fizyczne można zastosować w celu uzyskania poprawnych wyników. Fakt, że optymalizator opiera się na gwarancji unikatowości, na przykład w celu przekształcenia agregacji lub wybrania łączenia scalonego jeden do wielu, nie zostanie odzwierciedlony w statystykach użycia indeksu, chyba że indeks jest fizycznie dostępny w ostatecznym planie wykonania . Dlatego należy bardzo ostrożnie usuwać (lub wyłączać) każdy unikalny indeks lub ograniczenie.

Jeśli chodzi o # 2, czy to naprawdę możliwe?

Tak, optymalizator może korzystać ze statystyk powiązanych z indeksem bez ostatecznego planu wykonania zawierającego dostęp za pomocą tego indeksu. Procesy ładowania „interesujących” statystyk, obliczania szacunków liczności i tworzenia gotowego planu wykonania są dość niezależnymi czynnościami.

Usunięcie indeksu spowodowałoby również usunięcie powiązanych statystyk indeksu, co może wpłynąć na jakość planu przy ponownej kompilacji instrukcji. Statystyka indeksu może być wykorzystana do obliczenia oszacowania liczności, na którym opiera się ostateczny plan, nawet jeśli indeks nie jest fizycznie obecny w ostatecznym planie.

Twój DBA zna swoje rzeczy.

Nic z tego nie powinno oznaczać, że pozornie nieużywane indeksy nigdy nie powinny być usuwane. Po prostu mówię, że obawy twojego DBA są ważne, i powinieneś odpowiednio zaplanować zmianę wraz z odpowiednimi testami i planem naprawy. Z mojego doświadczenia wynika, że ​​punkt 1 jest bardziej problematyczny niż punkt 2, ale nie mam sposobu, aby dowiedzieć się, czy dotyczy to twojej sytuacji.

Paul White przywraca Monikę
źródło