- Jeśli
a
ib
oba mają 1000 różnych wartości i są zawsze odpytywane razem, więc kolejność kolumn w indeksie tak naprawdę nie ma znaczenia. Ale jeślia
ma tylko 10 odrębnych wartości lub masz zapytania, które używają tylko jednej z kolumn, to ma to znaczenie; w tych scenariuszach indeks nie może być używany, jeśli kolejność kolumn nie odpowiada zapytaniu. - Kolumna z najmniej odmiennymi wartościami powinna być pierwsza, a kolumna z najbardziej odmiennymi wartościami ostatnia. To nie tylko maksymalizuje użyteczność indeksu, ale także zwiększa potencjalne korzyści z kompresji indeksu.
- Typ danych i długość kolumny mają wpływ na zwrot, jaki możemy uzyskać z kompresji indeksu, ale nie na najlepszą kolejność kolumn w indeksie.
- Ułóż kolumny z najmniej selektywną kolumną jako pierwszą i najbardziej selektywną kolumną jako ostatnią. W przypadku wiązania ołowiu z kolumną, która z większym prawdopodobieństwem będzie używana samodzielnie.
Jedynym potencjalnym wyjątkiem od 2. i 3. są kolumny DATE. Ponieważ kolumny Oracle DATE zawierają element czasu, mogą mieć 86400 różnych wartości dziennie . Jednak większość zapytań w kolumnie danych jest zwykle zainteresowana tylko elementem dnia, więc możesz chcieć uwzględnić w obliczeniach tylko liczbę odrębnych dni. Chociaż podejrzewam, że nie wpłynie to na względną selektywność tylko w kilku przypadkach.
edytuj (w odpowiedzi na komentarz Nicka Pierpointa)
Dwa główne powody prowadzenia z najmniej selektywną kolumną to
- Kompresja indeksu
- Pomijanie indeksu odczytów
Oba działają magicznie, wiedząc, że wartość w bieżącym slocie jest taka sama jak wartość w poprzednim slocie. W konsekwencji możemy zmaksymalizować zwrot z tych technik, minimalizując liczbę zmian wartości. W poniższym przykładzie A
ma cztery różne wartości i B
ma sześć. Ditto reprezentują kompresowalną wartość lub blok indeksu możliwy do pominięcia.
Least selective column leads ...
A B
--------- -
AARDVARK 1
" 2
" 3
" 4
" 5
" 6
DIFFVAL 1
" 2
" 3
" 4
" 5
" 6
OTHERVAL 1
" 2
" 3
" 4
" 5
" 6
WHATEVER 1
" 2
" 3
" 4
" 5
" 6
Najbardziej selektywne odprowadzenia kolumn ...
B A
- --------
1 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
2 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
3 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
4 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
5 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
6 AARDVARK
" DIFFVAL
" OTHERVAL
" WHATEVER
Nawet w tym trywialnym przykładzie (A, B)
ma 20 możliwych do pominięcia boksów w porównaniu z 18 z (B, A)
. Większa rozbieżność generowałaby większy zwrot z inwestycji przy kompresji indeksu lub lepsze narzędzie z odczytów pomijania indeksu.
Tak jak w przypadku większości heurystyk dostrajających, musimy przeprowadzić benchmark przy użyciu rzeczywistych wartości i realistycznych objętości. Jest to zdecydowanie scenariusz, w którym przekrzywienie danych może mieć dramatyczny wpływ na skuteczność różnych podejść.
„Myślę, że jeśli masz wysoce selektywny pierwszy indeks, to – z perspektywy wydajności – dobrze zrobisz, jeśli postawisz go na pierwszym miejscu”.
Jeśli mamy wysoce selektywną kolumnę, powinniśmy zbudować dla niej własny indeks. Jest mało prawdopodobne, aby dodatkowe korzyści wynikające z unikania operacji FILTEROWANIA na kilku wierszach były mniejsze niż koszty utrzymania indeksu złożonego.
Indeksy wielokolumnowe są najbardziej przydatne, gdy mamy:
- dwie lub więcej kolumn o średniej selektywności,
- które są często używane w tym samym zapytaniu.