Systemy zarządzania bazami danych
3. Indeksy
wartość
• Indeksy konwencjonalne
• B-drzewa i B+drzewa
Indeksowanie i haszowanie
wartośćrekord(y)
Plik uporządkowany
2010 4030 6050 8070 10090
Plik uporządkowany
2010 4030 6050 8070 10090 Indeks gęsty
10 20 30 40 50 60 70 80 90 100 110
Plik uporządkowany
2010 4030 6050 8070 10090 Indeks rzadki
10 30 50 70 90 110 130 150 170 190 210 230
Plik uporządkowany
2010 4030 6050 8070 10090 2. poziomu
10 30 50 70 90 110 130 150 170 190 210 10
90 170 250 330 410 490 570
Rzadki indeks
Pytanko
• Czy ma sens gęsty indeks drugiego poziomu?
Wskaźniki do rekordów
• Wskaźnik do bloku (w indeksie rzadkim) jest mniejszy niż wskaźnik do rekordu
WdB WdR
• Jeśli plik jest fizycznie ciągły, możemy
K1
K3 K4 K2
R1
R2
R3
R4
Załóżmy, że bloki mają 1KB
rekordu o kluczu K3
szukamy w bloku o offsecie (3-1)1024
Kompromis: indeks gęsty czy rzadki?
• Rzadki
– Mniej miejsca na indeks
– Więcej indeksu mieści się w RAM
• Gęsty
– Możemy sprawdzić, czy jest taki rekord bez zaglądania do pliku
Pojęcia
• Uporządkowany plik indeksowy
• Klucz wyszukiwania (nie zawsze klucz!)
• Indeks główny (na polu porządkującym)
• Indeks niegłówny (drugorzędny)
• Indeks gęsty lub rzadki
• Indeks pogrupowany lub niepogrupowany
• Indeks wewnętrzny lub zewnętrzny
• Indeks wielopoziomowy
Powtarzalne klucze
1010 2010 3020 3030
1010 2010 3020 3030 40
10 10 10 20 20 30 30 30
1010 2010 3020 3030 40
10 10 10 20 20 30 30 30
Powtarzalne klucze
• Czy indeks gęsty to jedyna możliwość?
1010 2010 3020 3030
10 20 30 40
Powtarzalne klucze
• Indeks gęsty, czy lepszy pomysł?
1010 2010 3020 3030 40
10 10 20 30
Starannie szukaj 20 i 30
Powtarzalne klucze
• A może jednak rzadki? Oto pierwszy pomysł:
1010 2010 3020 3030
10 20 30 30
Możema być 40?
Powtarzalne klucze
• Rzadki: tylko pierwszy nowy klucz z bloku
Powtarzalne klucze, indeks główny
• Indeks może wskazywać tylko pierwsze wystąpienie każdej wartości klucza
Plik Indeks
a
a a
b
Usuwanie z indeksu rzadkiego
2010 4030 6050 8070
10 30 50 70 90 110 130 150
Usuwanie z indeksu rzadkiego
2010 4030 6050 8070
10 30 50 70 90 110 130 150
– usuń rekord 40
Usuwanie z indeksu rzadkiego
2010 4030 6050 8070
10 30 50 70 90 110 130 150
– usuń rekord 30
40 40
Usuwanie z indeksu rzadkiego
2010 4030 6050 8070
10 30 50 70 90 110 130 150
– usuń rekordy 30 i 40
50 70
Usuwanie z indeksu gęstego
2010 4030 6050 8070
10 20 30 40 50 60 70 80
Usuwanie z indeksu gęstego
2010 4030 6050 8070
10 20 30 40 50 60 70 80
– usuń rekord 30
40 40
Wstawienie, indeks rzadki
2010 30
5040 60
10 30 40 60
Wstawienie, indeks rzadki
2010 30
5040 60
10 30 40 60
– wstaw rekord 34
34
• dziś mamy szczęście!
wolne miejsce jest tam gdzie go potrzebujemy
Wstawienie, indeks rzadki
2010 30
5040 60
10 30 40 60
– wstaw rekord 15
15 30 20
20
• Tu: natychmiastowa reorganizacja
• Inne opcje:
Wstawienie, indeks rzadki
2010 30
5040 60
10 30 40 60
– wstaw rekord 25
25
Lista bloków nadmiarowych (reorganizacji później...)
Wstawienie, indeks gęsty
• Podobnie
• Zwykle jednak bardziej kosztowne
Indeksy drugorzędne
5030 7020 4080 10010
6090
Indeksy drugorzędne
5030 7020 4080 10010
90
• Indeks rzadki
30 20 80 100
90 ...
Chyba nie zadziała?
Indeksy drugorzędne
5030 7020 4080 10010
6090
• Indeks gęsty
10 20 30 40 50 60 70 ...
10 50 90 ...
rzadki wyższy poziom
Indeksy drugorzędne
• Najniższy poziom musi być gęsty
• Wszystkie pozostałe są rzadkie
• Wskaźniki są wskaźnikami na rekordy
– Nie: wskaźniki blokowe – Nie: wyliczane
Klucze powtarzalne i indeks drugorzędny
1020 4020 4010 4010 4030
1020 4020 4010 4010 30
10 10 10 20 20 30 40 40 4040 ...
Pierwszy pomysł...
Problem:
Nadmierny narzut
• miejsce na dysku
• czas wyszukiwania
Klucze powtarzalne i indeks drugorzędny
1020 4020 4010 4010 4030
10
Inny pomysł...
40 30
Problem: 20
Indeks zawiera rekordy rozmiaru zmiennego
Klucze powtarzalne i indeks drugorzędny
1020 4020 4010 4010 4030
10 20 30 40 50 60 ...
Trzeci pomysł: lista rekordów o tej
samej wartości klucza?
Klucze powtarzalne i indeks drugorzędny
1020 4020 4010 4010 4030
1020 30 40 50 60 ...
Klucze powtarzalne i indeks drugorzędny
Pomysł z kubełkami jest dobry
• Po pierwsze rekordy indeksy stałej długości
• Przykładowy schemat
Indeksy Rekordy
Name: główny EMP (name,dept,floor,...)
Dept: drugorzędny Floor: drugorzędny
Znajdź pracowników z działu Toy i 2. piętra:
(‘Toy’ = Dept) ^ (floor = 2 )
Indeks na Dept Plik EMP Indeks na floor
Toy 2
Oblicz przecięcie obu kubełków, żeby
Ten pomysł jest stosowany do
wydobywania informacji z tekstu (IR)
Dokumenty
...the cat is fat ...
...was raining
cats and dogs...
...Fido the cat
dog
Zapytania IR (Information Retrieval)
• Znajdź dokumenty zawierające “cat” i “dog”
• Znajdź dokumenty zawierające “cat” lub
“dog”
• Znajdź dokumenty zawierające “cat” ale bez
“dog”
• Znajdź dokumenty zawierające “cat” w tytule
• Znajdź dokumenty zawierające “cat” i “dog”
w odległości co najwyżej 5 słów
Więcej danych na liście odwróconej
cat Tytuł 5
Tytuł 100 Autor 10 Streszczenie 57
d3 d2
d1
dog
miejsce
nr znaku
wskaźnik
Hasło = pozycja listy odwróconej
• Reprezentuje wystąpienie słowa w dokumencie
Długość listy: 1 Słowa rzadkie
(liczba haseł) lub błędy ortograficzne 106 Słowa często używane
Zagadnienia IR
• Słowa ignorowane
• Skracanie słów
• Wyrazy bliskoznaczne
• Fleksja (zwłaszcza w polskim: liczne pułapki)
– Po normalizacji słów okazało się że najczęściej w Panu Tadeuszu występuje słowo „oda” (od)
• Błędy ortograficzne
• Pełne teksty czy Streszczenia
Model przestrzeni wektorowej
s1 s2 s3 s4 s5 s6 s7 … Dokument= <1 0 0 1 1 0 0 …>
Zapytanie = <0 0 1 1 0 0 0 …>
Koniunkcja= ... + 1 + … = punktacja
Usprawnienia IR
• Model wektorowy przypomina listy bitmapowe
• Różne sposoby ważenia punktacji i normalizacji, np.
– Dopasowanie słowa częstego nie jest tak znaczące (wartościowe) jak słowa
rzadkiego
• Implementacja: Google, Altavista, ...
Indeksy konwencjonalne
• Zalety
– Proste
– Indeks jest plikiem uporządkowanym wygodnym przy pełnych przeglądach
• Wady
– Wstawienia są kosztowe lub
– Tracimy fizyczne uporządkowanie lub
ciągła alokacja
wolne miejsce
1020 30 4050 60 7080 90
3931 3536
3238 34 33
Bloki nadmiarowe
Przykład gnicia indeksu konwencjonalnego
Lekarstwo
• Nowy rodzaj indeksu
• Rezygnujemy z ciągłej alokacji stron indeksu
• Staramy się by się sam równoważył
• Rodzaje drzew równoważących się: AVL, czerwono-czarne, B-drzewa
• W bazach danych B-drzewa, w właściwie B+drzewa
Korzeń
Przykład B+drzewa n=3
100 120 150 180
30
3 5 11 30 35 100 101 110 120 013 150 156 179 180 200
Przykładowy węzeł wewnętrzny
do kluczy do kluczy do kluczy do kluczy
< 57 57 k<81 81k<95 95
57 81 95
Z pewnego nie-liścia
do następnego w kolejności liścia
57 81 95
rekordu uczu 57 rekordu uczu 81 rekordu uczu 85
Przykładowy liść
Rozmiar węzłów
• Rozmiar stały
– jeśli klucze stałego rozmiaru...
• n wartości kluczy
• n+1 wskaźników
– Liść: n wskaźników na rekordy i fastryga – Nie-liść: n+1 wskaźników na niższy poziom
Węzły nie mogą być zbyt puste
• Zapełnienie co najmniej 50%
– Teoretycznie...
– Praktycznie w zasadzie tak, ale nie do końca
• Zapełnienie co najmniej
– Nie-liść: (n+1)/2 wskaźników
– Liść: (n+1)/2 wskaźników na dane
Zapełniony Minimalny Nie-liść
Liść
n=3
120 150 180 30
3 5 11 30 35
się nawet gdy NULL
Reguły B+drzew
1. Wszystkie liście są na tym samym poziomie (drzewo zrównoważone)
2. Wskaźniki w liściach wskazują rekordy (z wyjątkiem fastrygi)
3. Liczba wskaźników i kluczy
• Stopień drzewa = n
Nie-liść
(nie-korzeń) n+1 n (n+1)/2 (n+1)/2- 1 (nie-korzeń) n+1Liść n
Korzeń n+1 n 1 1
Max Max Min Min wsk. klu. wsk.dane klu.
(n+1)/2 (n+1)/2
Wstawienie do B+drzewa
(a) Przypadek najłatwiejszy
– Gdy w liściu jest wolne miejsce
(b) Przepełnienie liścia
(c) Przepełnienie węzła wewnętrznego (d) Nowy korzeń
(a) Wstaw klucz = 32 n=3
3 5 11 30 31
30 100 32
(b) Wstaw klucz = 7 n=3
3 5 11 30 31
30 100
3 5 7 7
(c) Wstaw klucz = 160 n=3
100 120 150 180
150 156 179 180 200
160 180
160 179
(d) Wstaw 45 – nowy korzeń n=3
10 20 30
1 2 3 10 12 20 25 30 32 40 40 45
40
30Nowy korzeń
Usunięcie z B+drzewa
(a) Przypadek najłatwiejszy
(b) Scal się z sąsiadem (bliźniakiem) (c) Poprzerzucaj klucze
(d) Przypadki (b) lub (c) w nie-liściu
(b) Scalenie z sąsiadem
– Usuń 50
10 40 100
10 20 30 40 50
n=4
40
(c) Poprzerzucaj klucze
– Usuń 50
10 40 100
10 20 30 35 40 50
n=4
35
35
40 45 30 37
25 26 20 22
10 14 1 3
10 20 30 40
(d) Scalenie nie-liści
– Usuń 37
n=4
40 30
25
25
Nowy korzeń
Usunięcia z B+drzew w praktyce
• Zwykle nie dokonuje się scalania
– Jest zbyt kosztowne i nie warto tego robić – I tak trzeba co jakiś czas przebudować
indeksy ze względu na błędy w SZBD
B+drzewa a indeksy konwencjonalne
• Na podstawie
[1] Held i Stonebraker “B-Trees Re- examined”, Communications of ACM, Feb. 1978
Wnioski z [1]
• W B+drzewach trudniej obsługiwać współbieżność
• B+drzewa zużywają więcej przestrzeni
• Założenia analizy
– blok = 512 bajtów
– klucz = wskaźnik = 4 bajty – 4 rekordy w bloku
1 blok indeksu statycznego
127 kluczy
(127+1)4 = 512 bajtów k1
k2 k3
k1
k2
k3
1 blok danych
1 blok B+drzewa
63 klucze
63x(4+4)+8 = 512 bajtów
-> wskaźniki są konieczne do 63 k1
k2 ...
k63
k1
k2
k3
1 blok danych
next -
Porównanie rozmiarów [1]
Porównanie rozmiarów [1]
Indeks statyczny B+drzewo liczba liczba
bloków wysokość bloków wysokość
2 -> 127 2 2 -> 63 2
128 -> 16,129 3 64 -> 3968 3 16,130 -> 2,048,383 4 3969 -> 250,047 4 250,048 -> 15,752,961 5
Wyniki analizy [1]
• W przypadku pliku 8000-blokowego po 32 000 wstawieniach
po 16 000 wyszukiwaniach
Oszczedzamy tyle czasu, że starczy go na ręczną reorganizację
Wniosek z [1] Statyczne indeksy lepsze
[2] M. Stonebraker, “Retrospective on a database system,” TODS, June 1980
Wniosek z [2] B+drzewa są lepsze!
• DBA nie wie, kiedy reorganizować
• DBA nie wie, jak bardzo zapełnić strony indeksu po reorganizacji
• Zarządzanie buforami
– B+drzewo ma stałą wymaganą wielkość bufora (liczbę bloków)
– Indeks statyczny musi być może doczytać kilka stron nadmiarowych (co wymaga
większej i zmiennej liczby niezbędnych buforów)
Wnioski z [2] B+drzewa są lepsze
Zarządzanie buforami
• Czy LRU to dobra strategia zarządzania buforami?
– Oczywiście nie!
– Korzeń musi być przyszpilony w pamięci...
– I być może nizsze poziomy też – Czyli MRU!
Najlepszy stopień B+drzewa?
…
n to liczba kluczy w węzle
Przykładowe założenia
(1) Czas potrzebny na odczyt węzła z dysku (70+0.05n) ms
(2) Gdy węzeł jest w pamieci, korzystamy z wyszukiwania binarnego
(a + b LOG2 n) ms
Dla pewnych stałych a,b; Zakładamy, że a << 70
(3) Założmy, że B+drzewo jest zapełnione liczba węzłów do przejrzenia to
Minimalizujemy funkcję:
f(n) = czas poszukiwania rekordu
f(n)
nopt n
Znajdź n
opt=> pochodna f’(n) = 0
• nopt = kilkaset
• W praktyce koszt odczytu bloku nie zależy od n, bo węzeł = blok
• Ignorujemy koszt CPU
• Minimalizujemy więc LOGnN
• Czyli?
• Upychamy w bloku tyle kluczy, ile wlezie
A gdyby zwykłe B
drzewo? [ bez + ]
• Unikamy duplikacji kluczy
• Wskaźniki do rekordów są też w węzłach wewnętrznych
do rekordu do rekordu do rekordu do K1 z K2 z K3
do kluczy do kluczy do kluczy do kluczy < K1 K1<x<K2 K2<x<K3 >K3
K1 W1 K2 W2 K3 W3
Przykład B
drzewa n=2
65 125
145 165 85 105
25 45
10 20 30 40 110 120
90 100
70 80 170 180
50 60 130 140 150 160
Fastryga jest teraz bezużyteczna!
Uwaga o wstawieniach
• Wstawiamy rekord z kluczem 25
10 20 30 n=3
liść
– 20 –
• Potem:
Statystyka Bdrzew
MAX MIN
Wsk. Wsk. Klu. Wsk. Wsk. Klucze węz. rek. węz. rek.
Nie-liść
Nie-korzeń n+1 n n (n+1)/2 (n+1)/2-1 (n+1)/2-1
LiśćNie-korzeń 1 n n 1 (n+1)/2 (n+1)/2
Korzeń
Nie-liść n+1 n n 2 1 1
Korzeń
Liść 1 n n 1 1 1
Wady i zalety
Bdrzewa pozwalają na szybsze wyszukiwanie niż B+drzewa
W Bdrzewach liście i nie-liście są różnych rozmiarów
W Bdrzewach usuwanie trudniejsze
B+drzewa
Ale...
• Jeśli bloki są stałego rozmiaru (a tak jest w przypadku wielu dysków):
• To wyszukiwanie w B+drzewach jest w istocie lepsze.
Przykład
• Wskaźnik: 4 bajty
• Klucz 4 bajty
• Blok 100 bajtów (dla prostoty)
• Pełne dwupoziomowe drzewo
Korzeń ma 8 kluczy + 8 wskaźników na rekordy + 9 wskaźników na synów
= 8x4 + 8x4 + 9x4 = 100 bajtów Bdrzewo:
Każdy z 9 synów: 12 wsk. na rek. +12 kluczy
= 12x(4+4) + 4 = 100 bajtów 2-poziomowe Bdrzewo ma maksymalnie
12x9 + 8 = 116 rekordów
Korzeń ma 12 kluczy + 0 wskaźników na rekordy + 13 wskaźników na synów
= 12x4 + 0x4 + 13x4 = 100 bajtów B+drzewo:
Każdy z 13 synów: 12 wsk. na rek. +12 kluczy
= 12x(4+4) + 4 = 100 bajtów 2-poziomowe B+drzewo ma maksymalnie
Zatem?
ooooooooooooo ooooooooo
156 rekordów 108 rekordów Razem = 116
B+ B
8 rekordów
• Wniosek
– W przypadku bloków stałego rozmiaru,
– B+drzewa są lepsze, bo są bardziej krzaczaste