Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:czy kolejność kolumn ma znaczenie w indeksie?

  1. Jeśli a i b 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śli a 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.
  2. 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.
  3. 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.
  4. 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

  1. Kompresja indeksu
  2. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między AS i IS w procedurze składowanej Oracle?

  2. Błąd instalacji klienta Oracle — zbyt długa ścieżka

  3. Dostawca OraOLEDB.Oracle nie jest zarejestrowany na komputerze lokalnym

  4. ORA-65139:Niezgodność między plikiem metadanych XML a plikiem danych

  5. Jak dodać wskaźnik AD/BC do daty w Oracle?