Próbuję dostosować wydajność zapytania, które mamy w SQL Server 2014 Enterprise.
Otworzyłem rzeczywisty plan zapytań w SQL Sentry Plan Explorer i widzę w jednym węźle, że ma on Predykat wyszukiwania, a także Predykat
Jaka jest różnica między Seek Predicate a Predicate ?
Uwaga: Widzę, że istnieje wiele problemów z tym węzłem (np. Wiersze Oszacowane vs. Rzeczywiste, resztkowe IO), ale pytanie nie dotyczy żadnego z nich.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Odpowiedzi:
Rzućmy milion wierszy do tabeli tymczasowej wraz z kilkoma kolumnami:
Tutaj mam indeks klastrowy (domyślnie) w
PK
kolumnie. Jest indeks nieklastrowany,COL1
który ma kluczową kolumnęCOL1
i zawieraCOL2
.Rozważ następujące zapytanie:
Nie używam,
BETWEEN
bo Aaron Bertrand kręci się wokół tego pytania.W jaki sposób SQL Server powinien optymalizować to zapytanie? Wiem, że włączony filtr
PK
zmniejszy zestaw wyników do pięciu wierszy. Serwer SQL może użyć indeksu klastrowego, aby przejść do tych pięciu wierszy zamiast czytać wszystkie miliony wierszy w tabeli. Jednak indeks klastrowany ma tylko kolumnę PK jako kolumnę kluczową. Po wczytaniu wiersza do pamięci należy zastosować filtrCOL2
. TutajPK
jest orzeczeniem wyszukiwania iCOL2
jest orzeczeniem.Serwer SQL znajduje pięć wierszy za pomocą predykatu wyszukiwania i dodatkowo redukuje te pięć wierszy do jednego wiersza za pomocą normalnego predykatu.
Jeśli inaczej zdefiniuję indeks klastrowany:
I uruchom to samo zapytanie, otrzymuję różne wyniki:
W takim przypadku SQL Server może wyszukiwać przy użyciu obu kolumn w
WHERE
klauzuli. Dokładnie jeden wiersz jest odczytywany z tabeli przy użyciu kolumn klucza.Dla jeszcze jednego przykładu rozważ to zapytanie:
Indeks IX_174860_IX jest indeksem obejmującym, ponieważ zawiera wszystkie kolumny potrzebne do zapytania. Jest to jednak tylko
COL1
kluczowa kolumna. SQL Server może wyszukiwać za pomocą tej kolumny 1000 wierszy o pasującejCOL1
wartości. Może dalej filtrować te wiersze wCOL2
kolumnie, aby zmniejszyć ostateczny zestaw wyników do 0 wierszy.źródło