Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań1 Systemy zarządzania bazami danych 6. Optymalizacja zapytań
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań2 --> Generowanie i wybór planu Zapytanie GenerujPlany Oczyśćx x Oszacuj koszty Koszty Wybierz Optymalizacja zapytań Wybierz Minimum
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań3 Generując plany weź pod uwagę: Przekształcenia zapytania w algebrze relacji (np. porządek złączeń) Użycie istniejących indeksów Zbudowanie nowych indeksów Sortowanie na użytek zapytania
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań4 Szczegóły implementacyjne Algorytmy złączania Zarządzanie pamięcią Przetwarzanie równoległe
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań5 Szacowanie kosztów we/wy Liczba bloków dyskowych, które trzeba przeczytać (i/lub zapisać) aby zrealizować plan zapytania –Zapisy potrzebne np. do realizacji wielofazowego sortowania zewnętrznego
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań6 Szacowanie wymaga parametrów B(R) = liczba bloków z krotkami relacji R f(R) = liczba krotek R w jednym bloku M = liczba dostępnych ramek pamięci HT(i) = liczba poziomów indeksu i LB(i) = liczba bloków z liśćmi indeksu i Jakich operacji są to koszty?
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań7 Indeks pogrupowany Indeks, w którym pozycje indeksu są w takim samym fizycznym porządku jak rekordy ind. na A A
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań8 Różne znaczenia pogrupowania Grono (cluster) ….. Relacja pogrupowana (clustered) ….. Indeks pogrupowany (clustering) R1 R2 S1 S2R3 R4 S3 S4 R1 R2 R3 R4 R5 R5 R7 R8
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań9 R1 R2 po wspólnym atrybucie C T(R1) = T(R2) = S(R1) = S(R2) = 1/10 bloku Dostępna pamięć = 101 bloków Miara: liczba operacji we/wy (ignorując zapis wyniku – dlaczego?)
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań10 Ostrożnie To może nie być najlepszy sposób szacowania: –Ignorujemy koszt przetwarzania przez procesor –Ignorujemy synchronizację –Ignorujemy możliwości równoległej pracy procesora i dysku (np. DMA)
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań11 Możliwości Transformacje: R1 R2, R2 R1 –Która relacja prowadząca? –Jaka kolejność złączeń? Algorytmy złączenia: –Iteracyjne (nested loops) –Przez scalanie (sort-merge join) –Iteracyjne z indeksem (index nested loops) –Haszowane (hash join)
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań12 Złączenie iteracyjne for each r R1 do for each s R2 do if r.C = s.C then output
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań13 Przez scalanie (przykład) i R1{i}.CR2{j}.Cj
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań14 Przez scalanie (1) Jeśli R1 i R2 nie posortowane po C, posortuj je (2) i 1; j 1; while (i T(R1)) (j T(R2)) do if R1{ i }.C = R2{ j }.C then outputTuples else if R1{ i }.C > R2{ j }.C then j j+1 else if R1{ i }.C < R2{ j }.C then i i+1
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań15 Procedura outputTuples while (R1{ i }.C = R2{ j }.C) (i T(R1)) do [ jj j; while (R1{ i }.C = R2{ jj }.C) (jj T(R2)) do [ output ; jj jj+1 ] i i+1 ]
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań16 for each r R1 do [ X index (R2, C, r.C) for each s X do output ] Zakładamy istnienie indeksu na R2.C X index(R, A, W) wówczas: X = zbiór krotek R o atrybucie A równym W Iteracyjne z indeksem
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań17 –Funkcja haszująca h, przeciwdziedzina 0 k –Kubełki dla R1: G0, G1,... Gk –Kubełki dla R2: H0, H1,... Hk (1) Rozrzuć krotki R1 do kubełków G (hasz na C) (2) Rozrzuć krotki R2 do kubełków H (hasz na C) (3) Dla każdego i = 0, 1, 2,..., k dopasuj krotki z kubełków G i i H i Haszowane
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań18 Prosty przykład: parzyste/nieparzyste R1R2Kubełki 25 Parzyste: 44 R1 R Nieparzyste:
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań19 Czynniki wpływające na wydajność Czy krotki relacji są trzymane razem fizycznie (ciągłe)? Czy relacje są posortowane po atrybucie złączenia? Czy są dostępne indeksy? Jak selektywne jest zapytanie?
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań20 Złączenie iteracyjne R1 R2 Relacje nieciągłe T(R1) = T(R2) = S(R1) = S(R2) =1/10 bloku M = 101 bloków Koszt: dla każdej krotki R1: [Odczyt krotki + odczyt całej R2] Łącznie = [1+5000]= Masakra
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań21 Czy da się lepiej? Użyjmy naszych umysłów Żeby wykorzystać dostępną pamięć (1) Wczytaj 100 bloków R1 (2) Wczytaj całą R2 (używając 1 bloku) i złącz (3) Powtarzaj do wyczerpania R1
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań22 Dla każdego fragmentu R1: Odczyt fragmentu: 1000 Odczyt R2: Łącznie = x 6000 = Koszty? Amnestia
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań23 Czy można jeszcze lepiej? Odwróć kolejność: R2 R1 Łącznie = 5000 x ( ) = x =
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań24 Relacje ciągłe Złączenie iteracyjne R1 R2 Koszt Dla każdego fragmentu R2: Odczyt fragmentu: 100 Odczyt R1: Łącznie= 5 fragmentów x 1100 = 5500
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań25 Złączenie przez scalanie R1, R2 posortowane po C; ciągłe Pamięć R1 R2 ….. R1 R2 Łączny koszt: Odczyt R1 + Odczyt R2 = = 1.500
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań26 R1, R2 nieposortowane, ale ciągłe Trzeba je posortować Jak? Złączenie przez scalanie
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań27 Sortowanie przez scalanie (i) Dla każdego 100-blokowego fragmentu R: - Przeczytaj fragment - Posortuj go w pamięci - Zapisz go na dysk posortowane fragmenty Pamięć R1 R2...
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań28 (ii) Przeczytaj fragmenty, scal i wypisz Posortowany plik Pamięć posortowane fragmenty...
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań29 Koszt sortowania Każda krotka jest odczytywana, zapisywana odczytywana, zapisywana Koszt sortowania R1: 4 x 1000 = Koszt sortowania R2: 4 x 500 = 2.000
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań30 Sortowanie przez scalanie R1,R2 ciągłe ale nieposortowane Łączny koszt = sortowanie + scalanie = = 7500 Ale: Koszt złączenia iteracyjnego = Złączenie przez scalanie się nie opłaca!
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań31 Ale:R1 = bloków ciągłe R2 = bloków nieposortowane Iteracyjnie: 5000 x ( ) = 50x = Przez scalanie: 5( ) = Złączenie przez scalanie wygrywa!
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań32 Pamięć potrzebna do sortowania Np. Załóżmy że mamy 10 bloków fragmentów do złączenia potrzebujemy 100 bloków! R1
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań33 W ogólności Liczba ramek pamięci: k Wielkość relacji: x bloków Liczba fragmentów = (x/k) Wielkość fragmentu = k L. fragmentów < L. ramek przy scalaniu więc... (x/k) k lub k 2 x or k x
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań34 W naszym przykładzie R1 ma 1000 bloków, k R2 ma 500 bloków, k Potrzeba co najmniej 32 ramek
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań35 Czy da się jeszcze poprawić scalanie? Czy naprawdę potrzebujemy całkowicie posortowanych relacji? R1 R2 Złączenie Posortowane ciągi
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań36 Koszt poprawionego algorytmu Odczyt R1 + Zapis posortowanych frag. R1 + Odczyt R2 + Zapis posortowanych frag. R2 + scalenie = = 4500 Jakie są wymagania względem pamięci?
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań37 Iteracyjne z indeksem Załóżmy istnienie indeksu na R1.C (dwupoziomowego) Załóżmy, że R2 jest ciągła, nieposortowana Załóżmy, że indeks na R1.C mieści się w pamięci
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań38 Odczyt R2: 500 dla każdej krotki R2: - Wyszukiwanie w indeksie (za darmo) - Odczyt każdej krotki R1 wskazanej przez indeks to koszt 1 Koszt iteracyjnego z indeksem
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań39 Ile jest pasujących krotek? (a) Jeśli R1.C to klucz, R2.C to klucz obcy, to spodziewana liczba = 1 (b) Jeśli V(R1,C) = 5000, T(R1) = (z założeniem rozkładu równomiernego) spodziewana liczba = /5.000 = 2
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań40 (c) Jeśli DOM(R1, C)= T(R1) = gdy rozkład równomierny w dziedzinie Spodziewana = 10,000 = 1 liczba Ile jest pasujących krotek?
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań41 Koszt iteracyjnego z indeksem (a) Łącznie = (1)1 = 5,500 (b) Łącznie = (2)1 = 10,500 (c) Łącznie = (1/100)1=550
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań42 Gdy indeks nie mieści się pamięci? Załóżmy, że indeks na R1.C ma 201 bloków Trzymaj korzeń + 99 liści w pamięci Średni koszt każdego wyszukiwania to: E = (0)99 + (1)101 0,
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań43 = [Wyszukiwanie + pobierz rekordy] = [0,5+2] = = (przypadek b) Przypadek (c) = [0,5 1 + (1/100) 1] = = 3050 Koszt łączny (z wyszukiwaniem)
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań44 Dotychczas Iteracyjne R2 R (najlepszy) Scalanie _______ Sort+Scalanie _______ Z indeksem na R1.C _______ Z indeksem na R2.C _______ Iteracyjne R2 R Scalanie 1500 Sort+Scalanie Z indeksem na R1.C Z indeksem na R2.C ________ ciągłe nie-ciągłe
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań45 R1, R2 ciągłe (nie-posortowane) Użyj 100 kubełków Odczytaj R1, haszuj + zapisz kubełki R1 Haszowane bloków 100
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań46 ->Tak samo dla R2 ->Przeczytaj kubełek R1; zbuduj w pamięci tab.hasz. ->Przeczytaj odpowiedni kubełek R2 + złącz haszem R1 R2... R1 Pamięć... ->Powtórz dla wszystkich kubełków
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań47 Koszt Kubełkowanie Odczyt R1 + zapis Odczyt R2 + zapis Scalanie:Odczyt R1, R2 Koszt łączny = 3 x [ ] = 4500 Uwaga: to jest tylko oszacowanie, ponieważ kubełki mogą się różnić wielkością i trzeba je było zaokrąglić do wielkości bloku
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań48 Wymaganie pamięciowe Rozmiar kubełka dla R1 = (x/k) k = liczba ramek pamięci x = liczba bloków R1 Więc?(x/k) < k k > x potrzeba k+1 ramek
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań49 Sztuczka: trzymaj niektóre kubełki w RAM Np., k=33 kubełki R1 = 31 bloków trzymaj 2 w RAM pamięć G0G0 G1G1 wej =31 R1 Użycie pamięci: G031 ramek G131 ramek Wyjście33-2 ramek Odczyt R11 Łącznie94 ramek Zostało jeszcze 6 ramek! Hybrydowe złączenie haszowane
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań50 Następnie: Kubełkowanie R2 –Kubełki R2 =500/33= 16 bloków –Dwa z kubełków R2 od razu łączone z G0,G1 pamięć G0G0 G1G1 wej =31 R =31 Kubełki R2 Kubełki R1
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań51 Ostatecznie: Scal pozostałe kubełki –Dla każdej pary kubełków: Wczytaj jeden z nich w całości do pamięci Scal z drugim z nich pamięć GiGi wyj =31 wynik =31 Kubełki R2 Kubełki R1 cały kubełek R2 jedna ramka R1
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań52 Koszt hybrydowego haszowanego Kubełkowanie R1 = =1961 Kubełkowanie R2, zapisujemy tylko 31 kubełków, więc =996 Scalanie kubełków (2 już z głowy): odczyty =1457 Łącznie = = 4414
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań53 Ile kubełków trzymać w pamięci? pamięć G0G0 G1G1 wej. R1 pamięć G0G0 wej. R1 czy ?
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań54 Kolejna sztuczka dla haszowanego Do kubełków zapisuj tylko pary = Utworzenie indeksu haszowanego w locie Dopiero gdy znajdzie się para pasujących krotek, trzeba ściągnąć z dysku krotki
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań55 Założenia: –100 par w bloku –Spodziewana liczba krotek wynikowych = 100 Zbuduj tablicę haszującą dla R2 w pamięci 5000 krotek 5000/100 = 50 bloków Odczytaj R1 i scalaj Odczytaj ~ 100 krotek R2 Łączny koszt = Odczyt R2: 500 Odczyt R1:1000 Pobierz krotki:
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań56 Dotychczas Iteracyjne5500 Scalanie1500 Sort+scalanie7500 Indeks na R1.C Indeks na R2.C_____ Zbuduj indeks na R1.C _____ Zbuduj indeks na R2.C _____ Haszowane4500+ sztuczka,R1 prow.4414 sztuczka,R2 prow._____ Haszowane, wskaźniki1600 ciągłe
Oryginał: Hector Garcia-Molina6. Optymalizacja zapytań57 Podsumowanie Iteracyjne dobre dla małych relacji (w porównaniu z wielkością pamięci) Dla złączenia równościowego, gdy relacje nie są posortowane i nie ma indeksów, haszowane zwykle najlepsze Przez scalanie dobre dla złączeń nie- równościowych (np., R1.C > R2.C) Jeśli relacje już posortowane, użyj scalania Jeśli są indeksy, mogą być użyteczne (zależy to od selektywności – spodziewanego rozmiaru wyniku)