Optymalizacja zapytań Charakterystyka środowiska relacyjnej bazy danych 1. Złożone zapytania zawierające wiele elementarnych operacji relacyjnych: selekcji, projekcji, połączenia, porządkowania, itd. select p.nazwisko from pracownicy p, zespoły z where p.id_zesp = z.id_zesp and p.płaca = 7500 and z.budżet > 5 000 000 Przemienność operacji relacyjnych (a) π nazwisko (σ płaca=7500 Pracownicy) (σ budżet>5000000 Zespoły) (b) π nazwisko (σ płaca=7500 and budżet>5000000 (Pracownicy Zespoły)) (c) σ budżet>5000000 ((σ płaca=7500 (π nazwisko Pracownicy)) Zespoły) 2. Istnienie wielu alternatywnych logicznie równoważnych metod dostępu (fizyczna niezależność danych) σ płaca=7500 Pracownicy - (k) iteracja po wszystkich danych - (l) indeks drugorzędny Przykład B = 2 kb R(Pracownicy) = 100 B bfr(pracownicy) = 20 R(Zespoły) = 50 B bfr(zespoły) = 40 r(pracownicy) = 10 000 b(pracownicy) = 500 r(zespoły) = 100 b(zespoły) = 3 (a) σ płaca=7500 Pracownicy = P : iteracja 500 operacji I/O σ budżet>5000000 Zespoły = Z : iteracja 3 operacje I/O b(p ) = 2; b(z ) = 1 (P ) (Z ) = PZ: nested loop 3 operacje, b(pz) = 2 π nazwisko (PZ) = wynik: 2 operacje Razem: 508 operacji (b) (Pracownicy) (Zespoły) = PZ: nested loop (Pracownicy = outer, n=10) 650 operacji b(pz) = 770 σ płaca=7500 and budżet>5000000 (PZ) = PZ : iteracja 770 operacji I/O, b(pz ) = 2 π nazwisko (PZ) = wynik: 2 operacje Razem: 1422 operacje Kolejność wykonywania elementarnych operacji relacyjnych oraz wybór jednej z alternatywnych metod dostępu ma istotny wpływ na czasy wykonywania zapytań
Metody dostępu do danych Operacja selekcji S1. Iteracja: Odczytuj kolejno wszystkie rekordy pliku i sprawdzaj czy wartości ich atrybutów spełniają warunek selekcji. S2. Połowienie binarne: Jeżeli warunek logiczny operacji selekcji odwołuje się do atrybutu porządkującego plik można zastosować bardziej efektywną metodę wyszukiwania. Za pomocą algorytmu połowienia binarnego znajdź pierwszy rekord, który spełnia warunek zapytania. Następnie odczytaj kolejne rekordy spełniające warunek zapytania. S3. Zastosowanie indeksu: Jeżeli na atrybucie występującym w warunku logicznym selekcji jest założony indeks, to korzystając z tego indeksu znajdź wskaźnik na pierwszy rekord spełniający warunek zapytania. Następnie trawersując po liściach indeksu pobieraj kolejne wskaźniki rekordów spełniających warunek zapytania. S4. Zastosowanie funkcji mieszającej: Jeżeli zapytanie zawiera warunek logiczny zawierający atrybut, który jest argumentem funkcji mieszającej i operatorem relacyjnym jest operator "=" zastosuj funkcję mieszającą i wyznacz wskaźnik na szukany rekord. S5. Zastosowanie identyfikatora rekordu: Odczytaj rekord o danym identyfikatorze. Problem: Selektywność zapytania Czy zawsze należy korzystać z dostępnych indeksów lub plików haszowych? Selektywność = card(relacji wynikowej) card(relacji źródłowej) Przykład Relacja Pracownicy liczba rekordów = 2000, atrybut id_prac jest kluczem podstawowym relacji (q1) σ id_prac=120 (PRACOWNICY) selektywność(q1) = 1/2000 = 0,0005 (q2) σ etat=120 (PRACOWNICY) selektywność(q2) = 1/count(distinct etat) (q3) σ płeć='k' OR płaca>50000 (PRACOWNICY) selektywność(q2) = 1001/2000 0,5 (q4)σ płaca IS NOT NULL (PRACOWNICY) selektywność(q3) = 1998/2000 1
Estymacja kosztu metod dostępu dla operacji selekcji Koszty będą określane liczbą operacji I/O Liczba rekordów relacji r, liczba bloków zajmowanych przez relację b, selektywność zapytania s, wysokość indeksu h, rząd indeksu q. S1 S2 S3 b/2 (średnio) pomyślne odnalezienie rekordu spełniającego warunek atr = x, gdzie atr jest kluczem relacji b wszystkie pozostałe przypadki, niezależnie od selektywności zapytania log 2 b + s*b h + s q h-1 + s r lub h + s r/q + s r dla indeksu drugorzędnego h + s b dla indeksu podstawowego lub zgrupowanego S4 1 S5 1 Złożone warunki zapytania Koniunkcja warunków prostych S6. Zagnieżdżanie selekcji: Jeżeli w warunku zapytania występują atrybuty, dla których jest dostępna jedna z metod dostępu: S2 do S5, to zastosuj najbardziej selektywną metodę. Następnie odczytując rekordy wyznaczone przez tę metodę sprawdź, które z nich spełniają pozostałe warunki zapytania. S7. Metoda dostępu zdefiniowana na zbiorze atrybutów: Jeżeli dla kilku atrybutów występujących w warunku zapytania w porównaniach równościowych, jest dostępny indeks lub funkcja mieszająca zdefiniowane na konkatenacji tych atrybutów, zastosuj je. S8. Iloczyn logiczny zbiorów identyfikatorów: Jeżeli dla kilku atrybutów występujących w warunku zapytania, są dostępne metody dostępu: S2 do S5, to wyznacz za ich pomocą zbiory identyfikatorów rekordów spełniających poszczególne warunki zapytania. Następnie wyznacz iloczyn logiczny tych zbiorów. Suma warunków prostych S9. Suma logiczna zbiorów identyfikatorów: Jeżeli dla wszystkich atrybutów występujących w prostych warunkach zapytania połączonych operatorem OR, są dostępne metody dostępu: S2 do S5, to wyznacz za ich pomocą zbiory identyfikatorów rekordów spełniających te warunki. Następnie wyznacz sumę logiczną tych zbiorów.
Metody łączenia rekordów plików J1. Algorytm Nested loop: Wybierz jeden z plików jako zewnętrzny (outer), a drugi jako wewnętrzny (inner). Dla bufora pamięci o wielkości n bloków wczytuj kolejno do tego bufora po n-1 bloków pliku zewnętrznego. Po każdej operacji odczytu pliku zewnętrznego wczytuj pojedynczo do ostatniego bloku bufora wszystkie bloki pliku wewnętrznego. Spróbuj połączyć znajdujące się w buforze rekordy pliku zewnętrznego z rekordami pliku wewnętrznego. Połączone rekordy umieszczaj w pliku wynikowym. plik zewnętrzny n-1 plik wewnętrzny J2. Bezpośrednie ścieżki dostępu dla dopasowania rekordów: Jeżeli dla atrybutu połączeniowego jednego z plików jest dostępna jedna z metod dostępu: S2 do S5, to odczytuj kolejno wszystkie rekordy drugiego z nich. Dla każdego odczytanego rekordu, korzystając z bezpośredniej ścieżki dostępu znajdź wszystkie rekordy pierwszego pliku o danej wartości atrybutu połączeniowego. J3. Algorytm Sort-merge: Jeżeli łączone pliki są uporządkowane według wartości atrybutu połączeniowego (lub na atrybutach połączeniowych jest założony indeks), przeglądając liniowo obydwa pliki dopasowuj rekordy na podstawie wartości atrybutu połączeniowego. J4. Algorytm Hash-join: Zastosuj funkcję mieszającą na atrybucie połączeniowym dla utworzenia jednego pliku haszowego dla rekordów obydwu łączonych plików. J5. Plik zgrupowany: Korzystając z jednej z metod dostępu odczytaj połączone fizycznie rekordy. n
Koszty metod połączenia Selektywność połączenia - JS JS = R c S / R S JS określa rozmiar pliku wynikowego Szczególne przypadki: Dla operacji iloczynu kartezjańskiego JS = 1 Jeżeli warunek połączeniowy relacji R i S jest A = B, gdzie A jest kluczem w relacji R, wtedy R c S S, a więc JS 1/ R Współczynnik selektywności połączenia - JSF JSF jest równy procentowi rekordów danego pliku, dla których warunek połączeniowy jest spełniony Przykłady Plik A: r A = 50 rekordów, b A =10 bloków Plik B: r B = 5000 rekordów, b B = 2000 bloków Bufor pamięci: n = 6 bloków, js = 1/5000, bfr AB = 2 Wysokość indeksu na atrybucie połącz. pliku A: x A =2 Wysokość indeksu na atrybucie połącz. pliku B: x B =4 Rząd drzewa p = 100, q = 75 J1. Liczba odczytanych bloków pliku zewnętrznego = b o Liczba transferów bloków pliku zewnętrznego = b o /(n - 1) Liczba odczytanych bloków pliku wewnętrznego = b i b o /(n - 1) a) Plik B - zewnętrzny, plik A - wewnętrzny b B + (b A b B /(n - 1) ) + (js A B )/bfr AB = 2000 + ( 10 * 2000/5 ) + 50/2 = 6025 b) Plik A - zewnętrzny, plik B - wewnętrzny b A + (b B b A /(n - 1) ) + (js A B )/bfr AB = 10 + ( 2000 * 10/5 ) + 50/2 = 4035 J3. b A + b B + (js A B )/bfr AB = 2035 J2. JSF = 0,0002; a) b B + (r B (x A + JSF (r A /q+r A ))) + (js A B )/bfr AB = 2000 + (5000 2,01) + 50/2 10075 b) b A + (r A (x B + JSF (r B /q+r B ))) + (js A B )/bfr AB = 10 + (50 5,01) + 50/2 285
Drzewo zapytania Realizacja zapytań Struktura hierarchiczna odpowiadająca wyrażeniu algebry relacji: relacje są reprezentowane przez liście hierarchii, a operacje algebry przez węzły wewnętrzne Wykonanie drzewa zapytania Krokowe wykonanie operacji reprezentowanych przez wewnętrzne węzły drzewa zapytania w momencie gdy dostępne są wszystkie argumenty danej operacji. Węzły reprezentujące wykonane operacje są zastępowane relacjami, które powstały jako wynik tych operacji. Wykonanie drzewa zapytania kończy się kiedy wykonana zostanie operacja znajdująca się w korzeniu drzewa i zostanie ona zastąpiona ostatecznym wynikiem zapytania. Realizacja zapytań Kanoniczne drzewo zapytania Analizator składniowy zapytania transluje zapytania zapisane w języku zapytań (np. SQL) na kanoniczne drzewo zapytania. Przykład: SELECT nazwisko FROM pracownicy p, projekty k, udział u WHERE p.id_prac = k.prac AND u.proj = k.id_proj AND u.zatrudniony < '1-03-1998' AND k.budżet > 500000 π nazwisko σ id_prac=prac AND proj=id_proj AND zatrudniony < '1-03-1998' AND budżet > 500000 r π nazwisko, nazwa >< id_zesp = id r Udział Pracownicy Zespoły Pracownicy Projekty W ogólności dla danego zapytania istnieje wiele równoważnych drzew zapytania.
Optymalizacja zapytań Kolejność wykonywania operacji relacyjnych drzewo zapytania ma wpływ na czas wykonywania zapytania.? Pracownicy π nazwisko, nazwa σ staż_pracy > 10 >< id_zesp = id Zespoły Celem działania optymalizatora zapytań jest transformacja nieefektywnego kanonicznego drzewa zapytania w równoważne logicznie drzewo, którego wykonanie będzie efektywne. Reguły transformacji drzewa zapytania (1) Rozbicie operacji selekcji: zamiana operacji selekcji z warunkiem, który jest iloczynem logicznym warunków składowych, na sekwencję operacji selekcji ze składowymi warunkami zapytania: σ C1 AND C 2 (R) σ C1 (σ C2 (R)), (2) Rozbicie operacji selekcji: zamiana operacji selekcji z warunkiem, który jest sumą logiczną warunków składowych, na sumę operacji selekcji ze składowymi warunkami zapytania: σ C1 OR C 2 (R) σ C1 (R) σ C2 (R). (3) Przemienność operacji selekcji: σ C1 (σ C2 (R)) σ C2 (σ C1 (R)). (4) Sekwencja operacji projekcji: w sekwencji operacji projekcji wszystkie operacje za wyjątkiem pierwszej mogą zostać usunięte: π L1 (π L2 (π L3 (R))) π L 1 (R), gdzie: L 1 L 2 L 3.
(5) Przemienność operacji projekcji i selekcji: π A1, A2,..., An (σ C (R)) σ C (π A1, A2,..., An (R)), gdzie: warunek C odwołuje się jedynie do atrybutów A 1, A 2,..., A n. (6) Przemienność operacji połączenia (lub iloczynu kartezjańskiego): R >< C S S >< C R (Rr S Sr R). (7) Przemienność operacji selekcji i połączenia (lub iloczynu kartezjańskiego): σ C (R >< S) (σ C1 (R)) >< (σ C2 (S)) gdzie: C 1 AND C 2 = C. (8) Przemienność operacji projekcji i połączenia (lub iloczynu kartezjańskiego): π L (R >< C S) (π L 1 (R) >< C (π L2 (S)), (10) Łączność operacji połączenia, iloczynu kartezjańskiego, sumy i iloczynu relacji: (R Θ S) Θ T R Θ (S Θ T), gdzie: Θ reprezentuje jedną z wymienionych operacji binarnych. (11) Przemienność operacji selekcji z operacjami sumy, iloczynu i różnicy relacji: σ C (R Θ S) (σ C (R)) Θ (σ C (T)), gdzie: Θ reprezentuje jedną z wymienionych operacji. (12) Przemienność operacji projekcji z operacją sumy relacji: π L (R S) π L (R) π L (T). gdzie: L = A 1, A 2,..., A n, B 1, B 2,..., B m, L 1 = A 1, A 2,..., A n, A n+1,..., A n+k, L 2 = B 1, B 2,..., B m, B m+1,..., B m+p. Atrybuty o indeksach n+1 do n+k i m+1 do m+p, są to atrybuty z poza listy L, do których odwołuje się warunek C. (9) Przemienność operacji sumy i iloczynu relacji: R Θ S S Θ R, gdzie: Θ reprezentuje jeden z operatorów lub.
Zasady działania algorytmu optymalizacji zapytań Ogólną zasadą działania algorytmy jest takie przesuwanie węzłów wewnętrznych w drzewie zapytania, aby operacje bardziej restrykcyjne (tzn. takie, których wynikiem są relacje przejściowe o najmniejszym rozmiarze) były wykonywane w pierwszej kolejności. 1. Korzystając z reguły transformacji (1) dziel operacje selekcji na selekcje z warunkami elementarnymi. Ułatwi to przesuwanie wybranych selekcji w dół drzewa zapytania. 2. Korzystając z reguł (3), (5), (7) i (11) opisujących własność przemienności operacji selekcji z innymi operacjami relacyjnymi, przesuń każdą z powstałych operacji selekcji jak najniżej w dół drzewa. π nazwisko σ proj=id_proj r 3. Korzystając z reguły transformacji (10) dotyczącej łączności operacji binarnych zmień kolejność łączenia relacji tak, żeby jako pierwsze były wykonywane operacje na relacjach o najbardziej restryktywnym warunku selekcji. σ budżet > 500000 Projekty σ proj=id_proj r π nazwisko σ id_prac=prac r Pracownicy σ zatrudniony < '1-03-1998' Udział 4. Połącz iloczyny kartezjańskie relacji z operacjami selekcji, które reprezentują warunki połączeniowe, w operacje połączenia relacji. π nazwisko σ id_prac=prac σ zatrudniony < '1-03-1998' >< id_prac=prac r Udział >< proj=id_proj Pracownicy Pracownicy σ budżet > 500000 Projekty σ budżet > 500000 Projekty σ zatrudniony < '1-03-1998' Udział
5. Korzystając z reguł (4), (5), (8) i (12) opisujących własności podziału i przemienności operacji projekcji podziel i przesuń operacje projekcji jak najniżej w dół drzewa zapytania. Jeżeli potrzeba twórz nowe operacje projekcji. π id_proj σ budżet > 500000 Projekty π prac >< proj=id_proj π nazwisko >< id_prac=prac π id_prac, nazwisko π proj, prac Udział Pracownicy σ zatrudniony < '1-03-1998' Kosztowa optymalizacja fizycznych planów zapytań Fizyczny plan zapytania obejmuje: Porządek i łączenie operacji komutatywnych i łącznych. Metodę dostępu dla każdego operatora w planie logicznym. Dodanie operacji nie występujących w planie logicznym, ale niezbędnych dla planu fizycznego (np. sortowania). Sposób przesyłania argumentów między operatorami: składowanie wyników przejściowych lub przesyłanie pojedynczych danych między buforami. σ płaca>5000 PRACOWNICY <IdZesp=IdZesp> ZESPOŁY Nested Loops Full Table Access (Zespoły) Table Access by ROWID (Pracownicy) Index Scan (Płaca)
Funkcja kosztu Składniki funkcji kosztu Operacje dyskowe (D): szukanie, czytanie i zapis bloków dyskowych (podstawowa część kosztów) [liczba operacji dyskowych] Zajętość pamięci dyskowej (S): składowanie wyników pośrednich [liczba bloków dyskowych] Czas przetwarzania (P): czas wykonywania algorytmów związanych z metodami dostępu [liczba kroków algorytmu] Zajętość pamięci operacyjnej (M): przydział pamięci na bufory dla operacji sortowania, usuwania duplikatów, nested-loop, itp. [rozmiar przydzielonej pamięci] Koszty komunikacyjne (K): w przypadku wykonywania zapytań w środowisku rozproszonym [liczba przesyłanych bloków danych] Funkcja kosztu: suma ważona składników kosztu Przykładowa funkcja kosztu: Koszt = 0,7*D + 0,05*S + 0,05*P + 0,15*M + 0,05*K Dane wejściowe dla wyznaczania składników funkcji kosztu liczba rekordów w pliku liczba bloków danych zajmowanych przez plik średnia zajętość bloku średnia długość rekordów liczba różnych wartości danego atrybutu wartość minimalna i maksymalna wartość każdego atrybutu rozkład wartości wysokość indeksu liczba liści w indeksie współczynnik uporządkowania indeksowanego atrybutu ANALYZE {TABLE tablica INDEX indeks CLUSTER grono} { COMPUTE STATISTICS ESTIMATE STATISTICS SAMPLE liczba {ROWS PERCENTS} DELETE STATISTICS }
Składowanie informacji o rozkładach danych Histogramy danych Podział dziedziny na przedziały o stałej długości: (v 0 v 0 +d) n 0, (v 0 +d v 0 +2d) n 1,... Najczęściej występujące wartości: 2500 123, 2800 87, 2100 45, inne 459 Podział zbioru wartości atrybutu na n podzbiorów o stałej wielkości: (580 1200) 1, (1201 1350) 2,..., (4510 128000) n Szacowanie rozmiarów pośrednich wyników zapytań Pośrednie wyniki zapytania są argumentami kolejnych operacji relacyjnych Szacowanie rozmiarów selekcji S relacja źródłowa O=σ(S) relacja wynikowa r(r) liczba rekordów relacji R V(R,A) liczba różnych wartości atrybutu A relacji R 1. O=σ A=c (S) r(o)=r(s)/v(s,a) 2. O=σ A<c (S) r(o)=r(s)/3 3. O=σ A c (S) r(o)= r(s) (V(S,A)-1)/V(S,A) 4. O=σ A=c1 and B=c2 (S) r(o)= r(s)/(v(s,a) V(S,B)) 5. O=σ A=c1 or B=c2 (S) r(o)=r(s) (1-(1-1/V(S,A)) (1-1/V(S,B)))
Szacowanie rozmiarów połączenia 1. O=R R.X=S.YS r(o)=r(r) r(s)/max(v(r,x),v(s,y)) 2. O=R R.X=S.Y and R.W=S.ZS r(r) r(s) r(o)= (max(v(r,x),v(s,y)) (max(v(r,x),v(s,y)) Urealnienie kosztu operacji dyskowych Na czas wykonywania operacji dyskowych składają się trzy podstawowe składniki: czas szukania ścieżki (s) (10-50 [ms]); czas opóźnienia obrotu (rd); dla prędkości obrotowej p wyrażonej w liczbie obrotów na minutę, czas ten wynosi: rd = (1/2)*(1/p) [min] = (60*1000)/(2*p) [ms]; dla: p = 5400 [rpm], rd = 5,56 [ms]. czas transferu bloku (btt); zależy od rozmiaru ścieżki, rozmiaru transferowanego bloku i prędkości obrotowej dysku. Dla danej prędkości transferu tr czas transferu sektora o rozmiarze B wynosi: btt = B/tr [ms]. Dla ścieżki o rozmiarze 50 kb, i dla prędkości obrotowej dysku 5400 rpm, prędkość transferu danych wynosi: tr = (50*1000)/(60*1000/5400) = 4500 [bajtów/ms]; i dalej dla bloku B=2kB: btt = 0,46 [ms].
Wpływ rozkładu danych na czasy wykonywania operacji dyskowych Czas odczytu k bloków rozmieszczonych sekwencyjnie na jednej ścieżce będzie wynosił w tym wypadku: czas sekwencyjnie = s + rd + k * btt [ms]. Czas odczytu k bloków losowo rozrzuconych po dysku będzie wynosił: czas losowo = k * (s + rd + btt) [ms]. Dla k = 25, B = 2 [kb], s =10 [ms], rd = 5,56 [ms], btt = 0,46 [ms]: czas sekwencyjnie = 27,06 [ms], czas losowo = 400 [ms]. Optymalizacja zapytań w oparciu o funkcję kosztów Optymalizacja zapytań polega na znalezieniu optymalnego stanu w przestrzeni stanów zawierającej wszystkie możliwe plany wykonania danego zapytania. Stan optymalny jest to stan o najmniejszej wartości funkcji kosztu. Optymalizator zapytań jest charakteryzowany przez: Reguły transformacji służące do generowania przestrzeni stanów dla danego zapytania. Algorytm przeszukiwania przestrzeni stanów pozwalający na przechodzenie między poszczególnymi stanami. Funkcja kosztu, która jest stosowana do każdego ze stanów.
Algorytmy przeszukiwania 1. Algorytmy dokładne pełne przeszukiwanie (exhaustive search) programowanie dynamiczne 2. Algorytmy przybliżone heurystyki optymalizacja składniowa 3. Metaheurystyki - algorytmy kombinatoryczne Iterative Improvement Simulated Annealing Tabu Search Podstawowe pojęcia optymalizacji kombinatorycznej Stan akceptowalny plan wykonania zapytania Przestrzeń stanów zbiór wszystkich możliwych stanów Ruch wygenerowanie i przejście do nowego stanu Sąsiad stan osiągany ze stanu bieżącego za pomocą jednego ruchu Koszt stanu wartość funkcji kosztu dla danego planu zapytania Minimum lokalne stan, dla którego żaden z sąsiadów nie posiada niższego kosztu Minimum globalne stan o najniższym koszcie w przestrzeni stanów - rozwiązanie optymalne
Algorytmy kombinatoryczne Iterative Improvement 1. wybierz losowo stan początkowy; 2. przeszukuj przestrzeń stanów przez wykonywanie ruchów, akceptując tylko sąsiadów z niższym kosztem, aż do osiągnięcia minimum lokalnego; 3. powtarzaj kroki 1) i 2) do momentu spełnienia warunku kończącego optymalizację; 4. zwróć najlepsze znalezione minimum lokalne Simulated Annealing 1. wybierz losowo stan początkowy; 2. dobierz początkową temperaturę; 3. redukując stopniowo T przeszukuj przestrzeń stanów, akceptując zawsze sąsiadów z niższym kosztem i akceptując sąsiadów o wyższym koszcie z prawdopodobieństwem równym e- C/T; 4. gdy system zostanie zamrożony, zwróć najlepszy znaleziony stan; Tabu Search 1. wybierz losowo stan początkowy; 2. przeszukuj przestrzeń stanów przez wykonywanie ruchów, pamiętając na liście Tabu ostatnio odwiedzone stany; aby wykonać ruch: wygeneruj zbiór sąsiadów, którzy nie figurują na liście Tabu; wykonaj ruch w stronę najlepszego znalezionego sąsiada; 3. powtarzaj krok 2) do momentu spełnienia warunku kończącego optymalizację; 4. zwróć najlepszy znaleziony stan;