Plan wykładu 2 BAZY DANYCH Wykład 4: Indeksy. Pojęcie indeksu - rodzaje indeksów Metody implementacji indeksów struktury statyczne struktury dynamiczne Małgorzata Krętowska Wydział Informatyki PB Pojęcie indeksu Klucz wyszukiwania 3 Indeks to struktura danych na dysku umożliwiająca szybkie wyszukiwanie danych w bazie danych na podstawie wartości klucza wyszukiwania jak np. nazwisko osoby. Indeks = skorowidz w książce. W najprostszej postaci wyszukiwanie polega na tym, że mając wartość poszukujemy rekordów, w których ta wartość występuje w danym polu. 4 Klucz wyszukiwania (wartość indeksowana) dla indeksu jest to wybrane pole lub pola rekordu, względem których ma odbywać się wyszukiwanie. Indeks jest to struktura danych składająca się z węzłów, w których są zapisywane rekordy indeksu w następującej postaci: pozycje danych k* określane względem wartości klucza wyszukiwania k tzn sam rekord o kluczu k para (k,w) gdzie k jest kluczem rekordu, a w jest wskaźnikiem do rekordu o tym kluczu para (k,w 1,.., w n ), gdzie k jest kluczem rekordu, a w 1,.., w n są wskaźnikami do rekordów o kluczu k (wymaga zmiennej liczby pól) pozycje indeksu kierujące wyznaczeniem właściwej pozycji danych k* w oparciu o wartość klucza wyszukiwania k (np. para (wartość klucza, wskaźnik do węzła w indeksie)
5 Plik indeksowy Zawartość indeksu jest przechowywana w pliku indeksowym W skład pliku indeksowego wchodzą rekordy indeksu będące pozycjami danych lub pozycjami indeksu. Węzeł odpowiada na ogół stronie dyskowej i zawiera albo pozycje danych albo pozycje indeksu. 6 Rodzaje indeksów Indeks główny lub podstawowy (primary index) założony na atrybucie porządkującym unikalnym Indeks zgrupowany (clustering index) założony na atrybucie porządkującym nieunikalnym Indeks wtórny (secondary index) założony na atrybucie nieporządkującym Podział ze względu na liczbę wskazań do pliku danych: Indeks gęsty (dense) posiada rekord indeksu dla każdego rekordu indeksowanego pliku danych Indeks rzadki (sparse) posiada rekordy tylko dla wybranych rekordów indeksowanego pliku danych 7 Indeks główny (podstawowy) 8 Indeks zgrupowany
9 Indeks zgrupowany z blokami nadmiarowymi 10 Indeks wtórny Złożone klucze wyszukiwania Metody implementacji indeksów 11 12 Pojedyncze klucze wyszukiwania - wyszukiwanie według pojedynczego pola Złożone klucze wyszukiwania - wyszukiwanie według kombinacji większej liczby pól 29,5000 29 Indeksy statyczne 34,1500 34 34,2000 43,3000 <wiek, zarobki> 1500,34 2000,34 Adamski 34 1500 Bakun 29 5000 Molski 34 2000 Wilczak 43 3000 34 43 <wiek> 1500 2000 Indeksy dynamiczne 3000,43 5000,29 Rekordy danych posortowane względem imienia 3000 5000 <zarobki, wiek> <zarobki>
13 Statyczne drzewo ISAM (indexed sequential access method) Wyszukiwanie binarne - (pliki posortowane) porównujemy poszukiwany klucz z kluczem rekordu znajdującym się w środku ciągu i w zależności od wyniku porównania poszukujemy klucza albo w lewej części albo w prawej, stosując rekurencyjnie opisywaną metodę Poszukiwanie binarne łatwiej zastosować jest nie bezpośrednio do pliku rekordów, ale do pliku zawierającego same klucze rekordów k 1 <k 2 <...<k N, gdzie k i jest najmniejszym kluczem na stronie o numerze i. Plik z kluczami stanowi plik indeksowy Po wyznaczeniu najbliższego pasującego klucza wystarczy przejść do strony z rekordami, na której znajduje się rekord o danym kluczu. Jednopoziomowy plik indeksowy k1 k2 kn Plik indeksowy 14 Statyczne drzewo ISAM Strona indeksu jednopoziomowego (węzeł) składa się z pozycji danych <k i, P i >, gdzie k i jest kluczem, a P i jest wskaźnikiem na stronę zawierającą wartości klucza >= od klucza k i. Wskaźnik P 0 stanowi wskaźnik na stronę o wartościach klucza <k 1. Pozycja danych p 0 k 1 p 1 k 2 p 2... k m p m Zasady poszukiwania danego klucza 21 34 56 Strona indeksu k 1 <k 2 <...<k m Strona 1 Strona 2 Strona 3 strona N Plik danych Do strony z wartościami klucza <21 Do strony z 21<=k <34 Do strony z 34<=k <56 Do strony z k >=56 15 Indeks wielopoziomowy (drzewo ISAM) Strona indeksu wielopoziomowego (węzeł) składa się z pozycji indeksu <k i, P i >, gdzie k i jest kluczem, a P i jest wskaźnikiem do węzła wyższego poziomu zawierającego wartości kluczy >= od klucza k i. Wskaźnik P 0 stanowi wskaźnik do węzła wyższego poziomu zawierającego wartości klucza <k 1. 16 Struktura drzewa ISAM Węzły wewnętrzne Pozycja indeksu p 0 k 1 p 1 k 2 p 2... k m p m Strona indeksu k 1 <k 2 <...<k m liście Wskaźniki na węzły wyższego poziomu Strony nadmiarowe Strony główne
17 Problemy Dodawanie i usuwanie rekordów w przypadku indeksu głównego jest to problem złożony, gdyż musimy wstawić rekord na odpowiedniej pozycji w pliku. Wiąże się to z przeniesieniem części rekordów w pliku, a co za tym idzie zmiany wpisu w indeksie, gdyż przesunięcie rekordów powoduje zmiany wartości kluczy w danym bloku. 18 Przykład operacji wstawiania 40 20 33 51 63 10* 15* 20* 27* 33* 37* 40* 46* 51* 55* 63* 97* Próby rozwiązania problemu: Wykorzystanie nieuporządkowanego pliku przepełnienia Użycie listy jednokierunkowej rekordów przepełnienia dla każdego bloku w pliku danych (przykład indeksu - kolejny slajd) Zadanie Do zadanego drzewa ISAM wstawić wartości 23*, 48*, 41*, 42* 19 Przykład operacji wstawienia 40 20 33 51 63 10* 15* 20* 27* 33* 37* 40* 46* 51* 55* 63* 97* 23* 48* 41* 42* Struktura stron indeksu i stron głównych jest niezmienna. Gdy nie wystarcza miejsca na stronach głównych, doczepiane są strony nadmiarowe. Duża liczba stron nadmiarowych powoduje wydłużenie wyszukiwania rekordów 20 Podsumowanie drzew ISAM Drzewa ISAM dobrze sprawdzają się do wyszukiwania rekordu na podstawie wartości jego klucza, a także rekordów z zakresu wartości klucza: A<=klucz<=B; A<=klucz, klucz<=b Gdy liczba rekordów w pliku jest mniej więcej stała struktura ISAM jest dobra Niebezpieczeństwo grupowania się kluczy w ciągi na stronach nadmiarowych (rozwiązanie struktury dynamiczne)
Dynamiczne indeksy wielopoziomowe B-drzewo 21 22 B-drzewa B + - drzewa B-drzewo rzędu p: każdy wierzchołek wewnętrzny na postać: <P 1, <K 1, Pr 1 >, P 2, <K 2, Pr 2 >,...,<K q-1, P q-1 >, P q > gdzie q<=p. Każde P i oznacza wskaźnik drzewa - wskaźnik na inny wierzchołek w B-drzewie. Każde Pr i oznacza wskaźnik danych - wskaźnik na rekord, którego wartość pola klucza wyszukiwania jest równa K i (lub blok w pliku zawierający ten rekord) w każdym wierzchołku K 1 <K 2 <...<K q-1 dla wszystkich wartości pola wyszukiwania X w poddrzewie, na które wskazuje wskaźnik P i mamy K i-1 <X<K i, dla 1<i<q oraz K i-1 <X dla i=q Każdy wierzchołek prócz korzeni i liści posiada co najmniej ceil(p/2) wskaźników drzewa Wszystkie liście znajdują się na tym samym poziomie. Liście posiadają taką samą strukturę co wierzchołki wewnętrzne poza tym, że ich wskaźniki drzewa są zerowe B-drzewo B + - drzewo 23 P 1 K 1 Pr 1 P 2 K i-1 Pr i-1 P i K i Pr i K q-1 Pr q-1 P q Wskaźnik danych Wskaźnik danych Wskaźnik danych Wskaźnik danych X<K 1 Ki-1 <X<K i K q-1 <X Z powodu niejednolitosci węzłów dla B drzew operacje INSERT i DELETE są bardziej skomplikowane => B + - drzewa. 24 Wykorzystywane przez większość implementacji dynamicznych indeksów Wyróżniamy wierzchołki wewnętrzne i liście (różne struktury danych) Wymagana zajętość strony indeksu wynosi minimum 50% ( z wyjątkiem korzenia) Zajętość każdej strony liścia wynosi minimum 50%. Wierzchołki liści są zwykle połączone razem, co zapewnia możliwość uzyskiwania uporządkowanego dostępu do rekordów względem pola wyszukiwania B + - drzewo jest wyważone tzn. każdy liść znajduje się na tej samej głębokości
Wierzchołki wewnętrzne Wierzchołki wewnętrzne 25 Struktura wierzchołków wewnętrznych B+ - drzewa rzędu p: Każdy wierzchołek wewnętrzny ma postać <P 1, K 1, P 2,K 2,..., P q-1, K q-1, P q > gdzie q<=p i każde p i jest wskaźnikiem drzewa W każdym wierzchołku wewnętrznym K 1 <K 2 <...<K q-1. Dla wszystkich wartości pola wyszukiwania X w podrzewie, na które wskazuje wskaźnik p i mamy: K i-1 <X<=K i, dla 1<i<q oraz K i-1 <X dla i=q Każdy wierzchołek wewnętrzny posiada najwyżej p wskaźników drzewa Każdy wierzchołek wewnętrzny oprócz korzenia i liści posiada co najmniej ceil(p/2) wskaźników drzewa. Korzeń posiada co najmniej 2 wskaźniki drzewa. Wierzchołek wewnętrzny o q wskaźnikach drzewa, gdzie q<=p posiada q-1 wartości pola wyszukiwania 26 P 1 K 1 P i-1 K i K q-1 P q Wskaźniki drzewa X<=K 1 Ki-1 <X<=K i K q-1 <X Wierzchołki liści Wierzchołki liści 27 Struktura wierzchołków liści B + - drzewa rzędu p: Każdy wierzchołek liścia ma postać: <<K 1, Pr 1 >,<K 2,Pr 2 >,..., <K q-1, Pr q-1 >, P nast > gdzie q<=p i każde Pr i jest wskaźnikiem danych, zaś P nast wskazuje na następny wierzchołek liścia w B + -drzewie. W każdym wierzchołku liścia K 1 <K 2 <.., K q-1, dla q<=p Każde Pr i jest wskaźnikiem danych wskazujących na rekord, którego wartość pola wyszukiwania jest równa k i lub na blok pliku zawierający dany rekord (lub na blok rekordu wskaźników wskazujących na rekordy, których wartością pola wyszukiwania jest K i, jeżeli pole wyszukiwania nie jest kluczem) Każdy wierzchołek liścia posiada co najmniej ceil(p/2) wskaźników drzewa Wszystkie wierzchołki znajdują się na tym samym poziomie 28 K 1 Pr 1 K 2 Pr 2 K i Pr i K q-1 Pr q-1 P nast Wskaźnik danych Wskaźnik danych Wskaźnik na następny wierzchołek liścia w drzewie
Podsumowanie drzew 29 30 Zastosowania indeksów o strukturze drzewiastej wyszukiwanie zakresowe wyszukiwanie równowartościowe sortowanie (order by) wyszukiwanie przy uzgadnianiu wierszy w trakcie złączania tabel Drzewo ISAM - struktura statyczna struktura prostsza niż B + -drzewa modyfikowane są tylko liście wymagane są strony nadmiarowe, mogące pogorszyć czas wykonywania wyszukiwania B + -drzewo - struktura dynamiczna w praktyce wysokość<=3 zakładając, że korzeń drzewa jest zawsze trzymany w buforze RAM, koszt wyszukania pozycji danych rekordu wynosi co najwyżej 3 operacje we/wy Indeks w postaci B + -drzewa CREATE INDEX nazwa_indeksu ON tabela(kolumna); Wykorzystywany dla atrybutów o dużej selektywności Nie przechowuje informacji o wartościach NULL 31 Indeksy złożone 32 Indeks unikalny CREATE INDEX nazwa_indeksu ON tabela (kolumna1, kolumna2, kolumna3); Składają się z większej liczby kolumn kolumn Stosuje się je gdy w zapytaniach występuje kilka kolumn w warunku WHERE Powinno się stosować kolejność kolumn według częstotliwości ich występowania w zapytaniach CREATE UNIXUE INDEX nazwa_indeksu ON tabela (kolumna); Tworzony, żeby zapewnić unikalność wartości indeksowanej kolumnie lub kolumnach.
33 Indeks funkcyjny CREATE INDEX nazwa_indeksu ON tabela (funkcja(kolumna)); Indeks przechowuje wartość funkcji (np. UPPER()) 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 34 Indeks bitmapowy CREATE BITMAP INDEX nazwa_indeksu ON tabela (kolumna); Wykorzystywane dla atrybutów o małej selektywności, np. płeć Przechowuje wartości NULL Rozmiar indeksu ściśle zależny od rozmiaru dziedziny atrybutu indeksu Indeks bitmapowy Indeks bitmapowy - przykład 35 Tablica (liczba kolumn liczba rekordów w tabeli; Liczba wierszy liczba różnych wartości analizowanego atrybutu) Wybrane rekordy są dostarczane do ORACLE jako listy RowID Najlepsze rezultaty uzyskuje się, jeżeli z jedną tabelą łączymy kilka indeksów bitmapowych Źródło: http://www.dba-oracle.com/oracle_tips_bitmapped_indexes.htm 36 Baza danych samochodów (n=20 mln) z dużą liczbą atrybutów o małej selektywności (liczba różnych wartości <100) Select nr_rejestracyjny from samochody where kolor = niebieski and marka = toyota and rok_produkcji = 2002; Uwaga: powyżej 100 różnych wartości atrybutu wielkość indeksu bitmapowego szybko rośnie i szybkość realizacji zapytań gwałtownie maleje.