Plany programu SQL Server: różnica między skanowaniem indeksu / wyszukiwaniem indeksu

87

W planie wykonania programu SQL Server jaka jest różnica między skanowaniem indeksu a przeszukiwaniem indeksu

Jestem na SQL Server 2005.

cindi
źródło

Odpowiedzi:

128

Skanowanie indeksu polega na tym, że serwer SQL odczytuje cały indeks w poszukiwaniu dopasowań - czas potrzebny na to jest proporcjonalny do rozmiaru indeksu.

Wyszukiwanie indeksu polega na tym, że serwer SQL używa struktury b-drzewa indeksu do wyszukiwania bezpośrednio pasujących rekordów (zobacz http://mattfleming.com/node/192, aby dowiedzieć się, jak to działa) - czas potrzebny jest tylko proporcjonalny do liczba pasujących rekordów.

  • Ogólnie rzecz biorąc, przeszukiwanie indeksu jest lepsze niż skanowanie indeksu (gdy liczba pasujących rekordów jest proporcjonalnie dużo mniejsza niż całkowita liczba rekordów), ponieważ czas potrzebny do wykonania przeszukiwania indeksu jest stały, niezależnie od całkowitej liczby rekordów w twoim stół.
  • Należy jednak pamiętać, że w niektórych sytuacjach skanowanie indeksu może być szybsze niż przeszukiwanie indeksu (czasami znacznie szybsze) - zwykle gdy tabela jest bardzo mała lub gdy duży procent rekordów jest zgodny z predykatem.
Justin
źródło
3
Czy łącze jest nadal aktywne? u mnie to nie działa. Proszę o pomoc, jeśli istnieje zaktualizowany link
Ronak Agrawal
2
@RonakAgrawal Wygląda na to, że link jest w rzeczywistości martwy - może zamiast tego sprawdź wikipedię ?
Justin
76

Podstawową zasadą, której należy przestrzegać, jest to, że skany są złe, poszukiwania są dobre.

Skanowanie indeksów

Kiedy SQL Server wykonuje skanowanie, ładuje obiekt, który chce odczytać z dysku do pamięci, a następnie czyta ten obiekt od góry do dołu, szukając potrzebnych rekordów.

Szukaj w indeksie

Kiedy SQL Server szuka danych, wie, gdzie w indeksie znajdą się dane, więc ładuje indeks z dysku, przechodzi bezpośrednio do części indeksu, której potrzebuje i czyta tam, gdzie kończą się potrzebne dane . Jest to oczywiście znacznie wydajniejsza operacja niż skanowanie, ponieważ SQL już wie, gdzie znajdują się poszukiwane dane.


Jak mogę zmodyfikować plan wykonania, aby użyć wyszukiwania zamiast skanowania?

Kiedy SQL Server szuka twoich danych, prawdopodobnie jedną z największych rzeczy, które spowodują, że SQL Server przełączy się z wyszukiwania do skanowania, jest sytuacja, gdy niektóre kolumny, których szukasz, nie są uwzględnione w indeksie, którego chcesz użyć. Najczęściej SQL Server cofnie się do wykonania skanowania indeksu klastrowego, ponieważ indeks klastrowany zawiera wszystkie kolumny w tabeli. Jest to jeden z największych powodów (przynajmniej moim zdaniem), dla których mamy teraz możliwość WŁĄCZANIA kolumn do indeksu, bez dodawania tych kolumn do indeksowanych kolumn indeksu. Uwzględniając dodatkowe kolumny w indeksie, zwiększamy rozmiar indeksu, ale umożliwiamy SQL Server odczyt indeksu bez konieczności powrotu do indeksu klastrowego lub do samej tabeli, aby uzyskać te wartości.

Bibliografia

Aby uzyskać informacje dotyczące specyfiki każdego z tych operatorów w planie wykonania programu SQL Server, zobacz ....

John Sansom
źródło
7

Krótka odpowiedź:

  • Skanowanie indeksu: kliknij wszystkie wiersze oprócz określonych kolumn.

  • Przeszukiwanie indeksu: dotknij określonych wierszy i określonych kolumn.

Duże oczy
źródło
4

W przypadku skanowania indeksu wszystkie wiersze indeksu są skanowane w celu znalezienia pasującego wiersza. Może to być wydajne w przypadku małych stołów. W przypadku wyszukiwania indeksu wystarczy dotknąć wierszy, które faktycznie spełniają kryteria, a więc jest ogólnie bardziej wydajne

AdaTheDev
źródło
2

Skanowanie indeksu ma miejsce, gdy definicja indeksu nie może znaleźć się w jednym wierszu, aby spełnić predykaty wyszukiwania. W takim przypadku SQL Server musi skanować wiele stron, aby znaleźć zakres wierszy spełniających predykaty wyszukiwania.

W przypadku przeszukiwania indeksu SQL Server znajduje jeden wiersz pasujący do predykatów wyszukiwania przy użyciu definicji indeksu .

Wyszukiwanie indeksowe jest lepsze i skuteczniejsze.

kevchadders
źródło
0

Skan dotyka każdego wiersza w tabeli, nawet jeśli tego szukasz, czy nie

Poszukiwanie patrzy tylko na rzędy, których szukasz.

Poszukiwania są zawsze lepsze niż skanowanie, ponieważ są one bardziej wydajne w sposobie wyszukiwania danych.

Dobre wyjaśnienie można znaleźć tutaj

AutomatedTester
źródło
3
Wyszukiwania nie zawsze są lepsze, na przykład jeśli tabela jest stosunkowo mała i duży procent wierszy w tej tabeli musi zostać zwrócony, skanowanie indeksu może okazać się znacznie bardziej wydajne.
Justin
1
Cześć Justin, myślę, że chcesz powiedzieć, że skany tabeli czasami mogą być lepsze. Wyszukiwanie indeksów jest zawsze lepsze niż skanowanie indeksu, chyba że mówimy o klastrach. Ale czasami skanowanie tabeli lub skanowanie indeksu klastrowego może być bardziej wydajne z podanego przez Ciebie powodu. Zamiast szukać indeksu i pobierać pola, których nie ma w indeksie tabeli, czasami ms sql użyje tabeli, nawet jeśli indeks ma pole kryteriów.
Jose Areas