Nasz projekt prowadzi bardzo dużą, bardzo skomplikowaną bazę danych. Około miesiąc temu zauważyliśmy, że przestrzeń wykorzystywana przez indeksowane kolumny zawierające wartości null robi się zbyt duża. W odpowiedzi napisałem jako skrypt, który dynamicznie przeszukiwałby wszystkie indeksy jednokolumnowe zawierające więcej niż 1% wartości pustych, a następnie upuszczał i odtwarzał te indeksy jako indeksy filtrowane pod warunkiem, że wartość NIE była NULL. Spowodowałoby to upuszczenie i odtworzenie setek indeksów w bazie danych i zwykle zwolniłoby prawie 15% miejsca używanego przez całą bazę danych.
Teraz mam dwa pytania na ten temat:
A) Jakie są wady korzystania z filtrowanych indeksów w ten sposób? Zakładam, że poprawiłoby to tylko wydajność, ale czy wiąże się to z jakimś ryzykiem?
B) Otrzymaliśmy błędy ( „nie można upuścić indeksu XYZ, ponieważ on nie istnieje lub nie masz uprawnień” ) podczas upuszczania i odtwarzania indeksów, nawet jeśli po sprawdzeniu wszystko poszło dokładnie tak, jak oczekiwano. Jak to się może stać?
Dzięki za wszelką pomoc!
Edycja: W odpowiedzi na @Thomas Kejser
Cześć i dzięki, ale okazuje się, że to była katastrofa. W tym czasie nie rozumieliśmy kilku rzeczy, takich jak:
- Podczas zapytania SQLOS tworzy plany indeksów przed ustaleniem, że nie może używać wartości NULL do łączenia kolumn tabeli. IE, naprawdę potrzebujesz filtru klauzuli WHERE dopasowującego indeks do każdego filtrowanego indeksu użytego w zapytaniu, w przeciwnym razie indeks nie będzie w ogóle używany.
- Upuszczanie i tworzenie indeksów oraz ponowne zbędne aktualizowanie ich statystyk może jeszcze nie wystarczyć do stworzenia zaktualizowanych planów, co zakładaliśmy, że tak. Wydaje się, że w niektórych przypadkach tylko wystarczająco duże obciążenie zmusi SQL Server do ponownej oceny planów.
- Istnieją pewne egzotyki dotyczące funkcjonalności narzędzia planowania wykonania, które są trudne do ustalenia wyłącznie na podstawie zdrowego rozsądku i logiki. Z tysiącami wygenerowanych przez kod odmian różnych zapytań, pozornie bezużyteczne indeksy mogą pomóc w niektórych statystykach i planach zapytań, które ostatecznie są wykorzystywane w zapytaniach krytycznych.
Ostatecznie zmiany te zostały cofnięte. Filtrowane indeksy są więc potężnym narzędziem, ale trzeba naprawdę dokładnie zrozumieć, jakie dane są pobierane z tych kolumn. Tam, gdzie normalne indeksy oprócz problemów z przestrzenią są raczej łatwe do zastosowania, indeksy filtrowane reprezentują rozwiązania bardzo dostosowane. Z pewnością nie zastępują one zwykłego indeksu, a raczej rozszerzenie go w tych szczególnych okolicznościach, które są wymagane.