Indeksy w bazie danych Oracle Autor: Michał Krzyżanowski
Co to jest indeks? Jest to struktura powiązana z tabelą lub klastrem umożliwiająca szybsze wykonywanie zapytań SQL Posiada strukturę logiczną i fizyczną niezależną od tabeli do jakiej się odwołuje Posiada własną przestrzeń dyskową Jest automatycznie utrzymywany przez system zarządzania bazą danych
Po co nam indeksy? Przyspieszają dostęp do danych Tworzone dla relacji Zalety: przyspieszają odczyt danych wpływają na stopień współbieżności wykonywanych operacji Wady: mogą znacznie spowolnić modyfikację danych zajmują przestrzeń dyskową
Podział indeksów: • ze względu na strukturę: - B-drzewa, bitmapowe, • ze względu na liczbę atrybutów indeksowych w kluczu: - indeksy zwykłe i indeksy złożone, • ze względu na unikalność wartości klucza: - indeksy unikalne i indeksy nieunikalne, • ze względu na kolejność wartości klucza: - indeksy zwykłe i indeksy odwrócone, • ze względu na sposób składowania: - indeksy nieskompresowane i indeksy skompresowane, • ze względu na zastosowania: - indeksy funkcyjne i bitmapowe indeksy połączeniowe.
Indeksy typu b-drzewo: Wykorzystywany dla atrybutów o dużej selektywności Wielkość indeksu słabo zależna od rozmiaru dziedziny indeksowanego atrybutu Nie przechowuje informacji o wartościach nullowych CREATE INDEX nazwa_indeksu ON tabela(kolumna);
Indeksy bitmapowe: Wykorzystywane dla atrybutów o małej selektywności, np. płeć Przechowuje wartości nullowe Rozmiar indeksu ściśle zależny od rozmiaru dziedziny atrybutu indeksu Nie można zakładać globalnych indeksów bitmapowych na partycjonowanych tabelach CREATE BITMAP INDEX nazwa_indeksu ON tabela (kolumna);
Indeksy złożone: Składają się z większej niż jedna ilości kolumn Stosuje się je gdy w zapytaniach występuje kilka kolumn w w warunku WHERE Powinno się stosować kolejność kolumn według częstotliwości ich występowania w zapytaniach CREATE INDEX nazwa_indeksu ON tabela (kolumna1, kolumna2, kolumna3);
Indeks unikalny: Tworzony, żeby zapewnić unikalność wartości indeksowanej kolumnie lub kolumnach. Nie można jednocześnie stworzyć indeksu unikalnego i bitmapowego. CREATE UNIXUE INDEX nazwa_indeksu ON tabela (kolumna);
Indeksy odwrócone Wartość w indeksie jest przechowywana w odwrotny sposób niż wartość przechowywana w atrybutach, np. wartość ‘ORACLE’ będzie przechowywana jako ‘ELCARO’ Stosowane do indeksowania sekwencji Powodują rozproszenie wartości w indeksie CREATE INDEX nazwa_indeksu ON tabela (kolumna) REVERSE;
Indeksy skompresowane: Redukuje zajmowaną przestrzeń dyskową poprzez powtarzające się wartości klucza indeksu Zwiększa zyżycie procesora przy przeglądaniu wartości indeksu Dostępne tylko dla indeksów typu B-drzewo CREATE INDEX nazwa_indeksu ON tabela(kolumna) COMPRESS 1;
Indeksy funkcyjne: Indeks przechowuje wartość funkcji lub wyrażenia zamiast wartości kolumny Wykorzystywany dla atrybutów, które w zapytaniach są często argumentami funkcji Indeksowane wyrażenie nie może zawierać funkcji agregujących CREATE INDEX nazwa_indeksu ON tabela (UPPER(kolumna));
Bitmapowe indeksy połączeniowe Jest tworzony przy złączaniu tabel Możliwe jest zastosowanie klauzuli WHERE przy tworzeniu indeksu CREATE BITMAP INDEX nazwa ON relacja (lista_atrybutów) FROM relacja_1, relacja_2, ..., relacja_n WHERE warunek_połączeniowy_1 AND warunek_połączeniowy_2 ... AND warunek_połączeniowy_n-1;
Kryteria wyboru indeksów Dane nie powinny być często modyfikowane Atrybuty często występujące w zapytaniach WHERE Atrybuty używane w warunkach złączeniowych Indeksu powinien znajdować się na innym dysku niż tabela źródłowa
Zarządzanie indeksami: Tworzenie indeksów Przebudowywanie indeksów Monitorowanie indeksów Usuwanie indeksów Zmiana nazwy indeksu
Przebudowa indeksów: ALTER INDEX nazwa_indeksu REBUILD; ALTER INDEX emp_name REBUILD ONLINE; - opcja ONLINE pozwala na modyfikację danych w tabeli źródłowej indeksu podczas jego przebudowy
Monitorowanie indeksu: CREATE INDEX nazwa_indeksu COMPUTE STATISTICS; ALTER INDEX nazwa_indeksu COMPUTE STATISTICS; ALTER INDEX index MONITORING USAGE; - włączanie monitoringu użycia indeksu ALTER INDEX index NOMONITORING USAGE; - wyłączanie monitoringu użycia indeksu
Usuwanie indeksów: DROP INDEX nazwa_indeksu; Nie można usunąć indeksu będącego jednocześnie kluczem unikalnym lub kluczem głównym tabeli. Należy wcześniej wyłączyć lub usunąć te constrainty.
Zmiana nazwy indeksu: ALTER INDEX nazwa_indeksu RENAME TO nowa_nazwa;
Widoki zawierające informacje o indeksach: DBA_INDEXES, ALL_INDEXES, USER_INDEXES - opisują indeksy w bazie danych; DBA_IND_COLUMNS, ALL_IND_COLUMNS, USER_IND_COLUMNS – przechowują informacje o indeksowanych kolumnach; DBA_IND_EXPRESSIONS, ALL_IND_EXPRESSIONS, USER_IND_EXPRESSIONS – opisują wyrażenia używane przez indeksy funkcyjne; DBA_IND_STATISTICS, ALL_IND_STATISTICS, USER_IND_STATISTICS – zawierają statystyki optymalizatora dotyczące indeksów.
Tabele oparte na indeksach: Dane są przechowywane w strukturze B-drzewa Oracle nie buduje tabeli tylko przechowywuje wszystkie wymagane informacje w postaci indeksu
Tworzenie tabeli: CREATE TABLE emp_iot ( emp_id number, ename varchar2(20), sal number(9,2), deptno number, CONSTRAINT pk_emp_iot_index PRIMARY KEY (emp_id) ) ORGANIZATION index;