Kiedy tworzysz indeks na kolumnie lub liczbie kolumn w MS SQL Server (używam wersji 2005), możesz określić, że indeks w każdej kolumnie będzie rosnący lub malejący. Trudno mi zrozumieć, dlaczego ten wybór jest tutaj. Czy przy użyciu technik sortowania binarnego wyszukiwanie nie byłoby równie szybkie? Jakie ma to znaczenie, które zamówienie wybieram?
sql
sql-server
optimization
indexing
Joshua Carmody
źródło
źródło
Odpowiedzi:
Ma to znaczenie przede wszystkim w przypadku korzystania z indeksów złożonych:
może być używany do:
lub:
, ale nie dla:
Indeks w jednej kolumnie może być efektywnie używany do sortowania na oba sposoby.
Zobacz artykuł na moim blogu, aby uzyskać szczegółowe informacje:
Aktualizacja:
W rzeczywistości może to mieć znaczenie nawet dla indeksu pojedynczej kolumny, chociaż nie jest to takie oczywiste.
Wyobraź sobie indeks w kolumnie tabeli grupowanej:
Indeks na
col1
zachowuje uporządkowane wartościcol1
wraz z odwołaniami do wierszy.Ponieważ tabela jest zgrupowana, odniesienia do wierszy są w rzeczywistości wartościami
pk
. Są również uporządkowane w ramach każdej wartościcol1
.Oznacza to, że liście indeksu są faktycznie uporządkowane według
(col1, pk)
, a to zapytanie:nie wymaga sortowania.
Jeśli utworzymy indeks w następujący sposób:
, wtedy wartości
col1
będą sortowane malejąco, ale wartości wpk
ramach każdej wartościcol1
będą sortowane rosnąco.Oznacza to, że następujące zapytanie:
może być obsługiwany przez,
ix_mytable_col1_desc
ale nie przezix_mytable_col1
.Innymi słowy, kolumny stanowiące a
CLUSTERED INDEX
w dowolnej tabeli są zawsze kolumnami końcowymi dowolnego innego indeksu w tej tabeli.źródło
W przypadku prawdziwego indeksu pojedynczej kolumny ma to niewielki wpływ z punktu widzenia Optymalizatora zapytań.
Do definicji tabeli
Zapytanie
Używa uporządkowanego skanowania z kierunkiem skanowania,
BACKWARD
jak widać w Planie wykonania. Istnieje jednak niewielka różnica polegająca na tym, że obecnie tylkoFORWARD
skany mogą być równoległe.Jednak może to mieć duże znaczenie pod względem logicznej fragmentacji . Jeśli indeks jest tworzony z kluczami malejącymi, ale nowe wiersze są dołączane z rosnącymi wartościami klucza, możesz skończyć z każdą stroną poza kolejnością logiczną. Może to poważnie wpłynąć na rozmiar odczytów IO podczas skanowania tabeli i nie ma ich w pamięci podręcznej.
Zobacz wyniki fragmentacji
dla skryptu poniżej
Można użyć karty wyników przestrzennych, aby zweryfikować przypuszczenie, że dzieje się tak, ponieważ późniejsze strony mają rosnące wartości kluczy w obu przypadkach.
źródło
Kolejność sortowania ma znaczenie, gdy chcesz pobrać wiele posortowanych danych, a nie pojedyncze rekordy.
Zwróć uwagę, że (jak sugerujesz w swoim pytaniu) kolejność sortowania jest zwykle znacznie mniej istotna niż to, które kolumny indeksujesz (system może odczytać indeks w odwrotnej kolejności, jeśli kolejność jest odwrotna do oczekiwanej). Rzadko kiedy zastanawiam się nad porządkiem sortowania indeksu, podczas gdy męczy mnie kolumny objęte indeksem.
@Quassnoi stanowi doskonały przykład tego, kiedy ma to znaczenie.
źródło