Systemy zarządzania bazami danych
4. Haszowanie i więcej wymiarów
Haszowanie
• klucz h(klucz) <klucz>
Kubełki (zwykle 1 blok dysku)
Oryginał: Hector Garcia-Molina 4. Haszowanie i więcej wymiarów 3
.
Indeks haszowany wewnętrzny
rekordy
.
. .
(1) klucz h(klucz)
(2) klucz h(klucz)
Indeks
rekord
klucz 1
• Indeksy drugorzędne mogą by tylko zewnętrzne
Indeks haszowany zewnętrzny
Funkcja haszująca
• Klucz = ‘x1 x2 … xn’ napis n-bajtowy
• Liczba kubełków = b
• h: dodaj x1 + x2 + ….. xn
– weź sumę modulo b
• To nie musi być dobra funkcja
– Sztuka Programowania D. Knutha Tom 3
• Przy dobrej funkcji spodziewamy się podobnej wielkości każdego kubełka
Kubełek
• Czy klucze mają być posortowane?
• Tak, ale tylko wtedy gdy czas procesora jest krytyczny a wstawienia i usunięcia rekordów nie są zbyt częste
Strona nadmiarowa
Wstawienie:
h(a) = 1 h(b) = 2 h(c) = 1 h(d) = 0
0 1 2 3
d a c b
h(e) = 1
e
0 1 2 3
a b c e
d
Usuwanie
Usuń:
e f
f g
Może przesunąć
“g” w górę?
c
dPrzybliżona reguła pielęgnacji
• Staraj się utrzymywać stopień wykorzystania między 50% a 80%
Stopień ten to liczba zajętych pozycji liczba wszystkich pozycji
• Jeśli < 50%, marnuje się miejsce
• Jeśli > 80%, strony nadmiarowe groźne wszystko zależy od jakości funkcji i
liczby rekordów na kubełek
Radzenie sobie ze wzrostem
• Strony nadmiarowe i reorganizacje
• Haszowanie dynamiczne
• Rozszerzalne
• Liniowe
Haszowanie rozszerzalne
(a) Patrzymy na i spośród b bitów wyniku funkcji haszującej
b h(K)
i
00110101
(b) Tworzymy katalog
h(K)[i ] do kubełka
Przykład: h(k) ma 4 bity; 2 klucze/kubełek
i = 1
1
1
0001
1001 1100
Wstaw 1010 11100
1010
Nowy katalog 2
00 01 10 11
i =
2 2
1
0001
2
1001 1010 2
1100 Wstaw:
0111 0000
00 01 10 11
2 i =
Kontynuacja przykładu
0111 0000
0111 0001
2 2
00 01 10 11
i = 2
1001 2 1010 1100 2 0111 2 0000 2 0001
Wstaw:
1001
Kontynuacja przykładu
1001 1001 1010
000 001 010 011 100 101 110 111
i = 3
3 3
Usuwanie przy h. rozszerzalnym
• Bez łączenie kubełków ALBO
• Z łączeniem kubełków i zmniejszaniem katalogu jeśli to możliwe
(Odwrotność wstawiania)
• Odtwórz prezentację wstecz, żeby zobaczyć
• Ale koszt wykrycia duży...
Haszowanie rozszerzalne
+ Obsługuje puchnące pliki
+ mniej reorganizując
+ bez pełnych reorganizacji – Pośredniość
(Nieźle jeśli katalog mieści się pamięci, ale...)
– Katalog zawsze rośnie dwukrotnie
(Raz się mieści a raz nie)
Haszowanie liniowe
Dwa pomysły:
(a) Używaj i młodszych bitów funkcji
01110101
wzrost b
i
(b) Plik rośnie liniowo
Przykład b=4 bity, i =2, 2 klucze/kubełek
00 01 10 11
0101 1111 0000
1010
m = 01 (najdalszy używany blok)
Kubełki na przyszly
wzrost
Jeśli h(k)[i ] m, to
szukaj w kubełku h(k)[i ] Reg.
0101 • mogą być strony nadmiarowe !
• wstaw 0101
Przykład b=4 bity, i =2, 2 klucze/kubełek
00 01 10 11
0101 1111 0000
1010
m = 01 (najdalszy blok) 10
1010
0101 • wstaw 0101
11
1111
0101
Kubełki na przyszly
wzrost
Kontynuacja: Jak dalej ma rosnąć?
00 01 10 11
1111 1010
0101 0101 0000
m = 11 (najdalszy blok) i = 2
0 0 0 0
100 101 110 111 3
. . .
100
100
101
101 0101 0101
Kiedy rozszerzać plik?
• Operacja rozszerzenia jest niezależna od operacji wstawienia
• Śledzimy stopień zapełnienia indeksu U
• Jeśli U wzrosnie powyżej wartości
granicznej, zwiększamy m (być może także i)
Haszowanie liniowe
+ Obsługuje puchnące pliki
+ marnując mniej miejsca + bez pełnych reorganizacji + Brak pośredniości (jak było przy
rozszerzalnym)
– Niestety dopuszcza strony nadmiarowe
Przypadek zły
Bardzo pełne
Bardzo puste Zwiększanie
m tylko spowoduje marnowanie miejsca
B+drzewo czy hasz?
• Haszowanie dobre do zapytań równościowych
SELECT * FROM R
WHERE R.A = 5;
B+drzewo czy hasz?
• B+drzewa dobre do zapytań zakresowych SELECT *
FROM R
WHERE R.A > 5;
• Ale też równościowych
• I do wielu innych rzeczy. I do złączeń równościowych/nierównościowych itd..
Definicja indeksu w SQL
• Create index nazw on rel (atr)
• Create unique index nazwa on rel (atr)
Tworzy klucz tabeli I pilnuje go!
• Drop INDEX nazwa
Niestety, SQL...
• Nie pozwala na specyfikację rodzaju (B+drzewo, Hasz, Bitmap, itd.)
• Nie pozwala na specyfikację parametrów
(wielkość tablicy, współczynnik zapełnienia, itd.)
• Komercyjne SZBD na szczęście to mogą
• Są też idenksy mieszane: zakresowo-haszowe
Indeks wielowymiarowy
• Jeśli lista atrybutów jest dłuższa, to indeks jest na wielu kluczach
CREATE INDEX foo ON R(bar1,bar2,bar3)
• Zapytanie: Znajdź rekordy spełniające
Strategia I
• Weź jeden indeks, np. Dept.
• Znajdź rekordy spełniające Dept = “Toy”
i sprawdź ich SAL
I1
• Weź dwa indeksy, manipuluj wskaźnikami
Toy Sal
> 50k
Strategia II
• Użyj indeksu wielowymiarowego
I1
I2
I3
Strategia III
Przykład
Przykładowy rekord
Indeks na DEPT
Indeks
Name=Joe DEPT=Sales SAL=15k
SalesArt Toy
10k15k 17k21k
12k15k 15k19k
Które zapytania obsłuży?
• Indeks (DEPT, SAL)
• Znajdź rekordy: Dept = “Sales” SAL=20k
• Znajdź rekordy: Dept = “Sales” SAL > 20k
• Znajdź rekordy: Dept = “Sales”
• Znajdź rekordy: SAL = 20k
Dane geograficzne
Dane:
<X1,Y1, Atrybuty>
<X2,Y2, Atrybuty >
x y
. . .
Zapytania
• Które miasto leży w punkcie <Xi,Yi>?
• Co leży w odległości do 5 km od <Xi,Yi>?
• Jaki obiekt jest najbliższy <Xi,Yi>?
h
n b
i a
o c
d
10 20
10 20
Przykład
e
g f
m l
k
25 15 35 20 j
40 30 20 10
h i g f d e c a b
• Szukaj punktów bliskich f
• Szukaj punktów bliskich b 5
15 15
Zapytania do takiego drzewa
• Znajdź punkty takie, że Yi > 20
• Znajdź punkty takie, że Xi < 5
• Znajdź punkty “bliskie” i = <12,38>
• Znajdź punkty “bliskie” b = <7,24>
Indeks siatkowy
klucz2
X1 X2 …… Xn V1
V2 klucz1
Vn
Do rekordów, w których
Zalety
• Można szybko znależć odpowiedzi:
– klucz1 = Vi klucz2 = Xj – klucz1 = Vi
– klucz2 = Xj
• Także zakresowo….
– klucz1 Vi klucz2 < Xj
Indeksy siatkowe mają jednak pułapkę
• Jak je ułożyć na dysku?
Jak
tablicę... X1 X2 X3 X4 X1 X2 X3 X4 X1 X2 X3 X4
V1 V2 V3
Problem:
• Musi być regularna, żeby dało się wyliczyć pozycję z <Vi,Xj>
Rozwiązanie: Pośredniość
Kubełki V1
V2
V3 *Siatka zawiera
V4 jedynie wskaźniki
na kubełki
Kubełki ------ ------
---- -- ---- --
---- -- X1 X2 X3
Dzięki pośredniości
• Siatka może być regularna bez marnowania miejsca
• Jest jednak pewna cena tej pośredniości...
Siatka może być też nad zakresami
Salary Siatka
Skala liniowa
1 2 3
Toy Sales Personnel
0-20K 1
20K-50K 2 50K- 8 3
Pliki siatkowe
Skuteczne wyszukiwanie wg wielu kluczy Narzuty i zarządzanie miejscem
(nic nie jest za darmo)
Trzeba znaleźć podziały zakresu, które równo rozrzucają klucze
+ -
-
Partycjonowana f. haszująca
klucz1 h1 h2 klucz2
010110 1110010
h1(toy) =0 000 h1(sales) =1 001 h1(art) =1 010
. 011
h2(10k). =01 100 h2(20k) =11 101 h2(30k) =01 110 h2(40k) =00 111
..
<Fred,toy,10k>,<Joe,sales,10k>
Przykład:
<Joe><Sally>
<Fred>
h1(toy) =0 000 h1(sales) =1 001
h1(art) =1 010
. 011
h2(10k). =01 100
h2(20k) =11 101
h2(30k) =01 110
h2(40k) =00 111
..
• Znajdź Emp takich, że Dept. = Sales Sal=40k
<Fred>
<Joe><Jan>
<Mary>
<Sally>
<Tom><Bill>
<Andy>
h1(toy) =0 000 h1(sales) =1 001
h1(art) =1 010
. 011
h2(10k). =01 100
h2(20k) =11 101
h2(30k) =01 110
h2(40k) =00 111
..
• Znajdź Emp takich, że Sal=30k
<Fred>
<Joe><Jan>
<Mary>
<Sally>
<Tom><Bill>
<Andy>
szukaj tu
h1(toy) =0 000 h1(sales) =1 001
h1(art) =1 010
. 011
h2(10k). =01 100 h2(20k) =11 101 h2(30k) =01 110 h2(40k) =00 111
..
• Znajdź Emp takich, że Dept. = Sales
<Fred>
<Joe><Jan>
<Mary>
<Sally>
<Tom><Bill>
<Andy>
szukaj tu