Bazy danych wykład dwunasty Wykonywanie i optymalizacja zapytań SQL Konrad Zdanowski Uniwersytet Kardynała Stefana Wyszyńskiego, Warszawa dwunasty Wykonywanie i optymalizacja zapytań SQL 1 / 36
Model kosztów Paremtry określajace rozmiar relacji R: B(R) liczba bloków jakie zajmuje R (będziemy zakładać, że relacja jest sklastrowana), T (R) liczba krotek w relacji R, V (R, A) liczba róznych wartości atrybutu A w R, V (R[a 1,..., a k ]) liczba róznych krotek o wartości atrybutów a 1,..., a k w R Szacujac koszty wykonania zapytania minimalizujemy liczbę operacji I/O. dwunasty Wykonywanie i optymalizacja zapytań SQL 2 / 36
Model kosztów Dla sklastrowanej relacji R koszt wczytania relacji to B(R). Koszt sortowania relacji R, jeśli ta mieści się w całości w pamięci operacyjnej, to również B(R). dwunasty Wykonywanie i optymalizacja zapytań SQL 3 / 36
Podstawowe operacje na relacjach przypomnienie Niech R(A 1,..., A k ), S(B 1,..., B n ) dane relacje. Rzutowanie π: A1,...,A m (R) = {(a 1,..., a m ) istnieją a m+1,..., a k, takie, że (a 1,..., a m, a m+1,..., a k ) R}. Oczywiście, możemy wybrać w rzutowaniu dowolne atrybuty. Dla warunku C na krotki relacji R, σ C (R) = {(a 1,..., a k ): C(a 1,..., a k )}. dwunasty Wykonywanie i optymalizacja zapytań SQL 4 / 36
Podstawowe operacje na relacjach przypomnienie Niech R(A, B, C, D), S(C, D, E) dane relacje. Złaczenie R S = {(a, b, c, d, e): (a, b, c, d) R (c, d, e) S}. Złaczenie warunkowe dla warunku Θ, R Θ S = {(a, b, c, d, e): (a, b, c, d) R (c, d, e) S Θ(a, b, c, d, e)}. dwunasty Wykonywanie i optymalizacja zapytań SQL 5 / 36
Koszt pewnych operacji jednoargumentowych Uwaga. Zajmiemy się kosztem operacji jednoprzebiegowych. Tzn. tylko raz wczytujemy dana krotkę i cały wynik albo zmieści się w pamięci operacyjnej albo możemy go generować online. Algorytm naiwny dla każdej nowej krotki sprawdzamy, czy już nie wystapiła ma koszt n 2 (dla n krotek wyniku to problem choć oczywiście nie zmieniamy ilości operacji I/O). Tablice z haszowaniem optymalizuja ten koszt wymagajac dodatkowej pamięci. Operacje agregujace możemy obliczać podczas tworzenia kolejnych krotek wynikowej relacji. dwunasty Wykonywanie i optymalizacja zapytań SQL 6 / 36
Koszt operacji dwuargumentowych Rozważmy operacje sumy, iloczyny, różnicy dla wielozbiorów i zbiorów (bez powtórzeń). Niech M liczba wolnych buforów w pamięci operacyjnej. Suma wielozbiorów dla relacji R i S to B(R) + B(S). Dla róznicy i iloczynu musimy wczytać mniejsza relację do pamięci operacyjnej, czyli musi być spełniony warunek min(b(r), B(S)) M( 1). Dla operacji na zbiorach (bez powtórzeń) musimy wczytać mniejsza relację i zarezerwować dodatkowa pamięć na struktury pomocnicze (jak tablice haszujace). W przybliżeniu mamy więc wymóg min(b(r), B(S)) M. dwunasty Wykonywanie i optymalizacja zapytań SQL 7 / 36
Koszt złaczenia Rozpatrzmy złaczenie R(A, B) S(B, C). Naiwny algorytm wymaga B(R)B(S) operacji wczytania. Jeśli mamy M buforów, możemy wczytywać po M 1 bloków relacji R i następnie wczytywać po jednym bloku z S aby stworzyć złaczenie. Koszt wyniesie około B(R)B(S)/M. dwunasty Wykonywanie i optymalizacja zapytań SQL 8 / 36
Koszt operacji dwuargumentowych Zauważmy, że koszt tych operacji możemy istotnie zmniejszyć przy zastosowaniu dodatkowyc struktur danych (np. tablic haszujacych, indeksów). Np. jeśli na B jest nałożony indeks w R lub S, możemy efektywnie znajdować krotki, które wejda do złaczenia. Koszt złaczenia będzie wtedy optymalny. dwunasty Wykonywanie i optymalizacja zapytań SQL 9 / 36
Przetważanie zapytania SQL Elementy procesu wykonywania zapytania: kompilacja zapytania (przedstawienie zapytania w optymalnej postaci logicznej, wykonywanie zapytania. Aby wykonanie przebiegło efektywnie potrzebujemy zdefiniować często dodatkowe struktury danych (np. indeksy). dwunasty Wykonywanie i optymalizacja zapytań SQL 10 / 36
Kompilowanie zapytania SQL Elementy procesu kompilowania zapytania: zapisanie zapytania w postaci wyrażenia algebry relacji (drzewo zapytania), wybranie optymalnej, z równoważnych, postaci zapytania, wybranie algorytmów przetważania bazy danych. Aby wykonanie przebiegło efektywnie potrzebujemy zdefiniować często dodatkowe struktury danych (np. indeksy). dwunasty Wykonywanie i optymalizacja zapytań SQL 11 / 36
Drzewo zapytania przykład select tytul from Ksiazki where rok == 2011; π tytul σ rok=2011 Ksiazki dwunasty Wykonywanie i optymalizacja zapytań SQL 12 / 36
Drzewo zapytania przykład select tytul from Ksiazki where rok = 2011 and wydawca = Znak ; Które z drzew da efektywniejsze wykonanie? π tytul π tytul σ rok=2011 σ rok=2011 rok= Znak σ rok= Znak Ksiazki Ksiazki Oba plany sa równoważne, bo σ C D (R) = σ C (σ D (R)). dwunasty Wykonywanie i optymalizacja zapytań SQL 13 / 36
Drzewo zapytania przykład select nazwisko, tytul from Ksiazki, Autorzy where Ksiazki.autor_id = Autorzy.id; π nazwisko, tytul σ Ksiazki.autor_id=Autorzy.id Ksiazki Autorzy dwunasty Wykonywanie i optymalizacja zapytań SQL 14 / 36
Drzewo zapytania przykład select nazwisko, tytul from Ksiazki, Autorzy where Ksiazki.autor_id = Autorzy.id and rok=2011; Które plan jest lepszy? Ci zmienia (prawdopodobna) obecność indeksu na atrybucie, po którym złaczamy? π nazwisko, tytul σ Ksiazki.autor_id=Autorzy.id rok=2011 Ksiazki Autorzy π nazwisko, tytul σ Ksiazki.autor_id=Autorzy.id σ rok=2011 Ksiazki Autorzy dwunasty Wykonywanie i optymalizacja zapytań SQL 15 / 36
Optymalizacja zapytania Stworzenie reprezentacji algebraicznej. Eliminacja (jeśli możliwa) podzapytań. Transformacje algebraiczne w algebrze relacji. Zdefiniowanie porzadku wykonywania złaczeń i innych operacji. Po tych krokach następuję wybór konkretnych algorytmów operujacych na bazie danych. dwunasty Wykonywanie i optymalizacja zapytań SQL 16 / 36
Analiza semantyczna zapytania Po stworzeniu reprezentacji algebraicznej możemy uprościć zapytanie korzystajac z praw logicznych oraz arytmetycznych. W szczególności możemy wyeliminowac warunki (i zapytania) sprzeczne. dwunasty Wykonywanie i optymalizacja zapytań SQL 17 / 36
Transformacja zapytania Korzystajac z praw algebry relacji możemy uprościć i zoptymalizować dane zapytanie Oprócz metod aksjomatycznych stosować można też analizy statystyczne, szacowanie kosztów w oparciu o statystyki działania bazy danych (pracochłonne i kosztowne). Operacje unarne (filtrujace) przesuwamy w dół drzewa zapytania. Operacje binarne przesuwamy w góre. Złaczenia najlepiej definiować na atrybutach, na których mamy zdefiniowany indeks. dwunasty Wykonywanie i optymalizacja zapytań SQL 18 / 36
Przykładowe prawa algebry relacji R (S T ) = (R S) T, R (S T ) = (R S) (R T ), σ C D (R) = σ C (σ D (R)) = σ C (R) σ D (R), σ C D (R) = σ C (R) σ D (R), dwunasty Wykonywanie i optymalizacja zapytań SQL 19 / 36
Przykładowe prawa algebry relacji σ C (R S) = σ C (R) S, jeśli C zawiera tylko predykaty z R to σ C (R S) = σ C (R) S, jeśli M = N Q, gdzie N to atrybuty z R a Q to atrybuty z S (i N i Q zawieraja atrybuty, po których obliczamy złaczenie), to π M (R S) = π N (R) π Q (S), jeśli M nie zawiera atrybutów Z, po których obliczamy złaczenie, to π M (R S) = π N Z (R) π Q Z (S). dwunasty Wykonywanie i optymalizacja zapytań SQL 20 / 36
Przykłady Niech dane R(A, B) i S(B, C). Czy lepsze jest σ A=a (R S) czy σ A=a (R) S? Czy lepsze jest σ A=a C=c (R S) czy σ A=a (R) σ C=c (S)? Czy σ A=a C=c (R S), czy σ A=a (R S) σ C=c (R S), czy (σ A=a (R) S) (R σ C=c (S)? Czy coś moga zmienić indeksy na atrybutacie C? dwunasty Wykonywanie i optymalizacja zapytań SQL 21 / 36
Optymalizacja podzapytań Podzapytanie wymaga obliczenia dla każdej krotki, która może należeć do wyniku. Trudno optymalizować razem zapytanie i podzapytanie. Optymalizujac je oddzielnie możemy pominać pewne możliwości uproszczenia. Zmniejszenie kosztów można (czasem) osiagn ać przez eleminacje podzapytania. dwunasty Wykonywanie i optymalizacja zapytań SQL 22 / 36
Przykład - optymalizacja podzapytań Jak zooptymalizować to zapytanie? select a. nazwisko, a. miasto from Autorzy a where a. rok_urodzenia >1980 and a. i d in ( select k. a u t o r _ i d from K s i a z k i k where k. rok_wydania < 2000 ) ; dwunasty Wykonywanie i optymalizacja zapytań SQL 23 / 36
Przykład - optymalizacja podzapytań select a. nazwisko, a. miasto from Autorzy a, K s i a z k i k where a. rok_urodzenia >1980 and k. rok_wydania < 2000 and a. i d = k. a u t o r _ i d ; dwunasty Wykonywanie i optymalizacja zapytań SQL 24 / 36
Przykład - optymalizacja podzapytań select a. nazwisko, a. miasto from Autorzy a where a. plec = F and k. rok_urodzenia <= ALL ( select b. rok_urodzenia from Autorzy b where b. plec = F and a. miasto_urodzenia = b. miasto_urodzenia ) ; dwunasty Wykonywanie i optymalizacja zapytań SQL 25 / 36
Przykład - optymalizacja podzapytań Obliczmy zbiór nie najmłodszych autorek: select a. nazwisko, a. miasto from Autorzy a where a. plec = F and k. rok_urodzenia > SOME ( select b. rok_urodzenia from Autorzy b where b. plec = F and a. miasto_urodzenia = b. miasto_urodzenia ) ; dwunasty Wykonywanie i optymalizacja zapytań SQL 26 / 36
Przykład - optymalizacja podzapytań Zoptymalizujmy ostatnie zapytanie: select a. nazwisko, a. miasto from Autorzy a, Autorzy b where a. plec = F and b. plec= F and a. miasto_urodzenia = b. miasto_urodzenia and a. rok_urodzenia > b. rok_urodzenia ; dwunasty Wykonywanie i optymalizacja zapytań SQL 27 / 36
Przykład - optymalizacja podzapytań Odejmijmy: ( select a. nazwisko, a. miasto from Autorzy a where a. plec = F ) except ( select a. nazwisko, a. miasto from Autorzy a, Autorzy b where a. plec = F and b. plec= F and a. miasto_urodzenia = b. miasto_urodzenia and a. rok_urodzenia > b. rok_urodzenia ; ) dwunasty Wykonywanie i optymalizacja zapytań SQL 28 / 36
Przesuwanie predykatów π nazwisko, tytul π nazwisko, tytul σ rok=2011 Ksiazki.autor_id=Autorzy.id Ksiazki.autor_id=Autorzy.id σ rok=2011 Autorzy Ksiazki Autorzy Ksiazki dwunasty Wykonywanie i optymalizacja zapytań SQL 29 / 36
Przesuwanie predykatów select w. nazwa, Min ( a. rok_urodzenia ) from Wydawnictwa w, Autorzy a where w. a u t o r _ i d = a. i d group by w. nazwa having Min ( a. rok_urodzenia ) <=1939; select w. nazwa, Min ( a. rok_urodzenia ) from Wydawnictwa w, Autorzy a where w. a u t o r _ i d = a. i d and a. rok_urodzenia <=1939 group by w. nazwa ; dwunasty Wykonywanie i optymalizacja zapytań SQL 30 / 36
Przesuwanie predykatów Czy tak też można? select w. nazwa, Min ( a. rok_urodzenia ) from Wydawnictwa w, Autorzy a where w. a u t o r _ i d = a. i d group by w. nazwa having Min ( a. rok_urodzenia ) >1939; select w. nazwa, Min ( a. rok_urodzenia ) from Wydawnictwa w, Autorzy a where w. a u t o r _ i d = a. i d and a. rok_urodzenia >1939 group by w. nazwa ; dwunasty Wykonywanie i optymalizacja zapytań SQL 31 / 36
Optymalizacja zapytania heurystyka Selekcje oparta na warunku, σ C (R) warto przenieść w dół drzewa, jeśli to możliwe. Podobnie postępujemy z projekcjami. Usuwanie powtórzeń często lepiej zrobić wyżej w drzewie (jeśli trzeba) aby operować na mniejszych relacjach. Przed złaczeniem lepiej wykonać selekcję na obu relacjach składowych (jeśli wogle chcemy wykonać selekcję). dwunasty Wykonywanie i optymalizacja zapytań SQL 32 / 36
Fizyczny plan realizacji zapytania Po dokonaniu optymalizacji logicznej trzeba wybrać algorytmy realizacji zapytania: kolejność wykonania operacji przemiennych jak złaczenia, sumy,..., algorytmy dla operatorów logicznych (haszowanie, zagnieżdżone pętle,... ), realizacja operatorów sortowania, grupowania,..., sposób przekazywania argumentów i wyników podzapytań (przez dysk, pamięć operacyjna, po jednej krotce,... ). dwunasty Wykonywanie i optymalizacja zapytań SQL 33 / 36
Szacowanie kosztów Aby wybrać odpowiednie algorytmu należy oszacować ich koszty, czyli przede wszystkim oszacować wielkość pośrednich wyników. Stosuje się tutaj: przewidywanie przypadków najgorszych, rachunek prawdopodobieństwa by wyliczyć oczekiwane wartości rozmiaru relacji obliczanie okresowo statystyk bazy danych. dwunasty Wykonywanie i optymalizacja zapytań SQL 34 / 36
Szacowanie kosztów rozmiar projekcji Jeśli dane maja rozkład jednostajny, to oczekiawna wielkość projekcji σ A=a (R) wynosi T (R)/V (R, A). W praktyce wiele danych ma np. rozkład Zipfa (np. rozmiar populacji miast - podzielony na przedziały). W rozkładzie Zipfa i-ta najczęstsza wartość występuje z częstotliwościa 1/ i. Otrzymujemy wtedy ciag stosunków częstości 1, 0.71, 0.58,... dwunasty Wykonywanie i optymalizacja zapytań SQL 35 / 36
Szacowanie kosztów Szacowanie rozmiaru sumy, iloczynu, różnicy dość łatwe choć niekoniecznie dokładne. Np. rozmiar różnicy R S zawiera się w T (R) a T (R) T (S). Średnio możemy przyjac (T (R) + (T (R) T (S)))/2 = T (R) T (S)/2. Złaczenie R(A, B) is S(B, C) może mieć w wyniku 0 krotek, T (R) krotek, jeśli B jest kluczem obcym w R pobieranym z S, rzędu T (R)T (S) krotek, jeśli wartość atrybutu B jest w obu relacjach taka sama i mało zmienna. Przy pewnych dodatkowych założeniach (V (R, B) V (S, B)) i V (R S, A) = V (R, A)) możemy szacować rozmiar złaczenia jako T (R)T (S)/ max(v (R, B), V (S, B)). dwunasty Wykonywanie i optymalizacja zapytań SQL 36 / 36