- Jeśli
a
i b
1000 oba mają różne wartości i są zawsze razem zapytaliśmy wtedy kolejność kolumn w indeksie nie ma naprawdę materia. Ale jeśli a
ma tylko 10 różnych 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żyty, jeśli kolejność kolumn nie pasuje do zapytania.
- Kolumna z najmniej różnymi wartościami powinna być pierwsza, a kolumna z najbardziej wyraźnymi wartościami ostatnia. To nie tylko maksymalizuje użyteczność indeksu, ale także zwiększa potencjalne zyski z kompresji indeksu.
- Typ i długość kolumny mają wpływ na zwrot, który możemy uzyskać z kompresji indeksu, ale nie na najlepszej kolejności kolumn w indeksie.
- Ułóż kolumny z najmniej selektywną kolumną jako pierwszą i najbardziej selektywną kolumną jako ostatnią. W przypadku prowadzenia ołowianego 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ą one zawierać 86400 różnych wartości dziennie. Jednak większość zapytań w kolumnie danych zwykle interesuje tylko element dnia, więc możesz wziąć pod uwagę tylko liczbę odrębnych dni w swoich obliczeniach. Chociaż podejrzewam, że nie wpłynie to na względną selektywność w zaledwie kilku przypadkach.
edycji (w odpowiedzi na komentarz Nick Pierpoint'S)
Dwa główne powody prowadzące z najmniejszym selektywnej kolumny są
- kompresji Index
- Index Pomiń czyta
Oba te elementy działają na podstawie wiedzy, że wartość w bieżącym gnieździe jest taka sama jak wartość w poprzednim gnieździe. 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, a B
ma sześć. Dittos reprezentują wartość ściśliwą lub blok indeksu możliwych 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
wyselekcjonowanych kolumny prowadzi ...
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 TRIVAL przykład (A, B)
ma szczeliny 20 można pominąć w porównaniu z 18 (B, A)
. Większa rozbieżność wygenerowałaby większy zwrot z inwestycji w kompresję indeksu lub lepszą użyteczność z odczytów Index Skip.
Podobnie jak w przypadku większości heurystyk tuningowych, musimy przeprowadzić analizę porównawczą z wykorzystaniem 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 selektywne pierwszy indeks następnie - z perspektywy Performance - zrobisz dobrze, aby umieścić go w pierwszej kolejności.”
Jeśli mamy wysoce selektywną kolumnę, to powinniśmy ją zbudować według własnego indeksu. Dodatkowe korzyści uniknięcia operacji FILTER na kilku wierszach raczej nie zostaną przeważone przez obciążenie związane z utrzymaniem złożonego indeksu.
indeksy Wielu kolumn są najbardziej przydatne, gdy mamy:
- dwa lub więcej kolumn średnio selektywności,
- , które są często używane w tym samym zapytaniu.
Witam. Nie jestem jasny w twoim punkcie 4. Czy możesz wyjaśnić? Na ogół najpierw wstawię * najbardziej * selektywną kolumnę. Najpierw wstawiłbym najmniej selektywną kolumnę, gdybym myślał, że histogram może prowadzić CBO do całkowitego pominięcia indeksu. –
Dzięki za dodatkową edycję APC - wyraźnie przedstawiłeś swój punkt widzenia. Twoja opinia na temat tego, co trzeba zrobić test porównawczy jest dobrze zrobione. Myślę, że jeśli masz bardzo selektywny pierwszy indeks - z punktu widzenia wydajności - dobrze zrobisz, aby go umieścić na pierwszym miejscu. Benchmark ... benchmark ... benchmark ... –