2010-02-04 21 views
19

indeksu na dwie kolumny mogą być tworzone z jednej z wypowiedziOracle: czy kolejność kolumn ma znaczenie w indeksie?

create index foo_ix on foo(a,b); 
create index foo_ix on foo(b,a); 
  1. Jak to wpływa na operacyjnych (wykonywania) charakterystykę za pomocą indeksu?

  2. Jak to wpływa na charakterystykę układu (fizyczną) indeksu?

  3. Czy typy/rozmiary kolumn mają wpływ na (1) lub (2)?

  4. Jakie są najlepsze praktyki dotyczące tworzenia indeksów wielokolumnowych?

Krótko mówiąc, czy ma znaczenie, która kolumna jest pierwsza?

Odpowiedz

19
  1. 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.
  2. 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.
  3. 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.
  4. 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ą

  1. kompresji Index
  2. 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.
+0

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. –

+0

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 ... –

3
  1. jeśli kolumna jest stosowany sam w zapytania Oracle użyje mniej efektywne pominąć skanowanie dostęp indeksu ścieżkę, jeśli to nie jest wiodącym kolumna w indeksie
  2. zależy od odpowiedniej selektywności kolumny te
  3. nie
  4. chciałbym spojrzeć na zapytań dotyczących kolumn w indeksie i pozycjonowanie ich pozycję w indeksie przez najsilniej odpytywany
4

Jednak według samego Oracle, to lepiej umieścić kolumnę z najwyższą pierwszej liczności:

http://docs.oracle.com/cd/B10500_01/server.920/a96533/data_acc.htm#2174

zamówieniem kluczyków kompozyt indeksy

Jeśli wszystkie klucze są używane w WHERE równie często, a następnie zamawianie tych kluczy od najbardziej selektywnego do najmniej selektywnego w instrukcji CREATE INDEX najlepiej poprawia wydajność zapytań.

Powiązane problemy