Dokumentacja Oracle zawiera doskonały zestaw kwestii dotyczących opcji indeksowania:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
Aktualizacja dla 19c:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D
Cytując:
-
Rozważ indeksowanie kluczy, które są często używane w klauzulach WHERE.
-
Rozważ indeksowanie kluczy, które są często używane do łączenia tabel w instrukcjach SQL. Aby uzyskać więcej informacji na temat optymalizacji złączeń, zobacz sekcję „Używanie klastrów mieszających w celu zwiększenia wydajności”.
-
Wybierz klucze indeksu, które mają wysoką selektywność. Selektywność indeksu to procent wierszy w tabeli o tej samej wartości dla indeksowanego klucza. Selektywność indeksu jest optymalna, jeśli kilka wierszy ma tę samą wartość. Uwaga:Oracle automatycznie tworzy indeksy lub używa istniejących indeksów dla kluczy i wyrażeń kluczy unikatowych i podstawowych, które definiujesz z ograniczeniami integralności.Indeksowanie kolumn o niskiej selektywności może być pomocne, jeśli rozkład danych jest zniekształcony, tak że jedna lub dwie wartości występują często rzadziej niż inne wartości.
-
Nie używaj standardowych indeksów B-drzewa dla kluczy lub wyrażeń z kilkoma odrębnymi wartościami. Takie klucze lub wyrażenia zwykle mają słabą selektywność i dlatego nie optymalizują wydajności, chyba że często wybierane wartości kluczy pojawiają się rzadziej niż inne wartości kluczy. W takich przypadkach można efektywnie używać indeksów bitmapowych, chyba że indeks jest często modyfikowany, jak w przypadku aplikacji OLTP o wysokiej współbieżności.
-
Nie indeksuj często modyfikowanych kolumn. Instrukcje UPDATE modyfikujące indeksowane kolumny oraz instrukcje INSERT i DELETE modyfikujące indeksowane tabele trwają dłużej niż w przypadku braku indeksu. Takie instrukcje SQL muszą modyfikować dane w indeksach, jak również dane w tabelach. Generują również dodatkowe cofanie i ponawianie.
-
Nie indeksuj kluczy, które pojawiają się tylko w klauzulach WHERE z funkcjami lub operatorami. Klauzula WHERE, która używa funkcji innej niż MIN lub MAX, lub operatora z kluczem indeksowanym nie udostępnia ścieżki dostępu, która używa indeksu, z wyjątkiem indeksów opartych na funkcjach.
-
Rozważ indeksowanie kluczy obcych ograniczeń integralności referencyjnej w przypadkach, w których duża liczba jednoczesnych instrukcji INSERT, UPDATE i DELETE uzyskuje dostęp do tabel nadrzędnych i podrzędnych. Taki indeks umożliwia UPDATE i DELETE w tabeli nadrzędnej bez blokowania udostępniania tabeli podrzędnej.
-
Wybierając indeksowanie klucza, należy rozważyć, czy wzrost wydajności zapytań jest wart utraty wydajności w przypadku operacji INSERT, UPDATE i DELETE oraz wykorzystania miejsca wymaganego do przechowywania indeksu. Możesz poeksperymentować, porównując czasy przetwarzania instrukcji SQL z indeksami i bez indeksów. Możesz mierzyć czas przetwarzania za pomocą funkcji śledzenia SQL.