W tym wpisie pokaże w jaki sposób indeks B-tree wpływa na jakość zapytania.

Przykład oprę na tabeli, która ma 100 tysięcy rekordów.

Otóż zapytanie do takiej tabeli o bez indeksu wymaga od nas sporego kosztu:

Wystarczy jednak, że dodamy indeks, a koszt znacząco się zmniejsza:

Jak widać w pierwszym przykładzie mamy klasyczne FULL TABLE SCAN. Co to oznacza? Gdy nie istnieje indeks, sama tabela jest jedyną dostępną ścieżką dostępu do wyników zapytania.
W tym scenariuszu Oracle nie ma innego wyboru, jak tylko sprawdzić każdy wiersz w każdym używanym bloku w tabeli (jest to właśnie pełne skanowanie tabeli), aby sprawdzić, czy istnieją poszukiwane wiersze. W drugim odczycie już nie skanujemy pełnej tabeli, tylko indeks oraz ROWID (jednoznacznie identyfikuje wiersz – dla tabel ułożonych w sterty – w bazie danych i zawiera jego fizyczną lokalizację (plik danych, blok i położenie wiersza w bloku).

Należy pamiętać, że zastosowanie tego typu indeksu ma sensowność przy wysokim stopniu wyjątkowości. Wtedy indeks jest bardzo efektywny. W żargonie baz danych bardzo selektywna (unikalna) wartość kolumny w porównaniu do całkowitej liczby wierszy w tabeli ma wysoką liczność. Mała liczność odnosi się do kilku unikalnych wartości w porównaniu do całkowitych wierszy dla tabeli.

Jak wygląda zatem proces odczytu danych z użyciem indeksu:

1.
Użytkownik przesyła zapytanie.

2.
Zapytanie jest przekazywane do procesu serwera Oracle.

3.
Optymalizator jest wywoływany. Tworzy plan wykonania, który obejmuje dostęp do indeksu.

4.
Dostęp do indeksu umożliwia pobranie ROWID() z interesującego wiersza tabeli.

5.
Przy użyciu ROWID wiersz znajduje się w pliku danych i je blokuje.

6.
Wiersz tabeli jest zwracany do procesu serwera Oracle.

7.
Proces serwera Oracle zwraca zestaw wyników do użytkownika.

 

 

Written by Przemysław Starosta