5. Przedstaw znane metody optymalizacji zapytań w bazach danych
Transkrypt
5. Przedstaw znane metody optymalizacji zapytań w bazach danych
5. Przedstaw znane metody optymalizacji zapytań w bazach danych (zalety i wady). (mam nadzieję że pisze na temat =D ) cytat z wykładu: „Wykonanie zapytania składającego się z większej ilości tabel wymaga przygotowania odpowiedniego planu wykonania zapytania. Jego optymalizacja jest podstawowym zadaniem współczesnych systemów zarządzania bazami danych. Optymalizacja to proces doboru odpowiednich struktur danych, metod dostępu i operacji (planu wykonania), w celu zminimalizowania kosztu realizacji polecenia. Optymalizacja jest wykonywany przez wyspecjalizowany moduł systemu – optymalizator zapytań. „ Metody optymalizacji: Optymalizacja dynamiczna zapytania - optymalizacja jest wykonywana za każdym razem, gdy zapytanie jest wykonywane. • Zaleta – wszystkie informacje potrzebne do wyboru optymalnej strategii są optymalne. • Wada – obniżenie sprawności zapytania. Optymalizacja statyczna zapytania – analiza składni, kontrola poprawności i optymalizacja wykonane są tylko raz. • Zaleta - unikanie analizy zapytania za każdym razem. • Wada - możliwość zaistnienia sytuacji, w której raz wybrana strategia nie jest już optymalna. (Dwie poniższe na pewno są stosowane w ORACLE nie wiem jak w innych bazach) Regułowy (ORACLE, RBO or Rule Based Optimization (statyczna) ): Oparty na rankingu metod dostępu do struktur danych. Preferowany dla aplikacji wsadowych. Obecnie nie zalecany do użytku. Optymalizatory regułowe dysponują zbiorem reguł postępowania (odnoszonych do konkretnych rodzajów zapytań), przy pomocy których wskazują najlepszy plan wykonania zapytania. Przykładowo, gdy użytkownik dokonuje selekcji rekordów tabeli, a dla tabeli tej dostępny jest indeks, to zostanie on użyty (niezależnie od rozmiaru tabeli i indeksu czy od selektywności warunku WHERE), gdyż tak mówi jedna z reguł. Zaletami optymalizatorów regułowych są: prostota budowy i duża szybkość działania (tzn. duża szybkość wyboru planu, niekoniecznie optymalnego). Kosztowy(CBO -> Cost Based Optimization (dynamiczna) ): Oparty na szacowaniu kosztu (czasu zajętości procesora, liczby operacji I/O, zajętości pamięci operacyjnej itp.) wykonania wszystkich potencjalnych planów zapytania. Zalecany dla wszystkich nowo powstających aplikacji Zakłada duże obciążenie systemu, dużą współbieżność operacji, niski współczynnik trafień w bufor danych. Na potrzeby tego optymalizatora robione są statystyki więcej szczegółów w odpowiedzi do następnego pytania. (nie znalazłem nic więcej na ten temat ale może warto poczytać tez o optymalizacji dostępu do plików, łączeniu tabel itp. Tylko nie wiem czy to na pewno jest do tego pytania, według mnie nie, ale jakby dr D drążył temat .. ) Aha i oczywiście optymalizujemy czas pracy sytemu w celu wykonania naszego zapytania. Składowe czasu przetwarzania naszego zapytania: Czas procesora Czas oczekiwania na operacje I/O Czas oczekiwania na komunikację I/O Czas oczekiwania na dostęp do zasobów używanych przez inne aplikacje 6. Omów realizację optymalizacji w kosztowym optymalizatorze zapytań. Należy opisać zagadnienia: szacowanie kosztu, statystyki, plan zapytania. Skoro już wiemy co to jest optymalizacja oraz co mamy zoptymalizować (patrz poprzednie pytanie) przypatrzmy się jak to wygląda w praktyce na przykładzie kosztowego optymalizatora zapytań. Zapytania są zwykle formułowane w języku SQL, którego główną cechą jest deklaratywność, co oznacza, że użytkownik określa „co ma być znalezione”, a nie „w jaki sposób ma być znalezione”. W związku z tym, dla każdego otrzymanego zapytania, system zarządzania bazą danych musi wygenerować odpowiedni mikroprogram, który zrealizuje zlecone zadanie. W nomenklaturze bazodanowej, mikroprogram taki nazywany jest planem wykonania zapytania (query execution plan). Wykonanie zapytania możliwe jest na kilka sposobów, każdy taki sposób to właśnie plan zapytania. Ma on formę drzewa binarnego, którego liście reprezentują operacje na dysku. Plany mogą być przedstawione w formie graficznej: lub tekstowej (forma wyświetlania planów zależy od DBMS'a i trybu pracy): StmtText ---|--Sort(ORDER BY:([c].[LastName] ASC)) |--Nested Loops(Inner Join, OUTER REFERENCES:([e].[ContactID], [Expr1004]) WITH UNORDERED PREFETCH) |--Clustered Index Scan(OBJECT:([AdventureWorks].[HumanResources].[Employee]. [PK_Employee_EmployeeID] AS [e])) |--Clustered Index Seek(OBJECT:([AdventureWorks].[Person]. [Contact].[PK_Contact_ContactID] AS [c]), SEEK:([c].[ContactID]=[AdventureWorks]. [HumanResources].[Employee].[ContactID] as [e].[ContactID]) ORDERED FORWARD) Plany te reprezentują zapytanie : SELECT * FROM HumanResources.Employee AS e INNER JOIN Person.Contact AS c ON e.ContactID = c.ContactID ORDER BY c.LastName W planach kolejne węzły oznaczają dane wejściowe dla rodzica. Jeden węzeł może mieć więcej niż jednego potomka (np operacje join) lub jednego (sort). Gdy zostaną wygenerowane już różne plany następuje estymacja kosztu wykonania każdego z planów. Estymację wykonujemy w oparciu o statystyki (o których więcej w dalszej części), oraz modelu matematycznego. Estymowany koszt jest powiązany z czasem wykonania zapytania, jednak nie należy go z nim mylić. W systemie Oracle jednostka kosztu odpowiada w przybliżeniu czasowi wykonania jednej operacji I/O w systemie operacyjnym. Po oszacowaniu wszystkich planów wybierany jest ten z najmniejszym kosztem. Analityczne wyznaczenie kosztu dla wybranego planu wykonania zapytania wymaga znajomości wielu parametrów bazy danych, np. liczby rekordów, jakie zostaną znalezione, rozmiarów łączonych tabel itp. Obliczenie tych wszystkich parametrów wpłynęłoby bardzo niekorzystnie na czas optymalizacji. Dlatego też system bazuje na statystykach . Statystyki zawierają informacje opisujące struktury danych : Dane generowane dla tabeli: Liczba wierszy Liczba bloków danych zawierających dane Liczba nigdy nie użytych, zaalokowanych bloków danych Średnia wielkość wolnego miejsca w zajętych blokach danych Liczba łańcuchowanych wierszy Średnia wielkość wierszy Dla wszystkich kolumn liczbę unikalnych wartości oraz wartość minimalną i maksymalną Dane generowane dla indeksu: Wysokość drzewa Liczba bloków-liści drzewa Liczba unikalnych wartości indeksu Średnia liczba bloków-liści przypadająca na jedną wartość klucza indeksu Średnia liczba bloków danych (w tabeli) przypadająca na jedną wartość indeksu Współczynnik zgrupowania, który określa na ile wiersze w tabeli są uporządkowane wg klucza indeksu Szczegółowe statystyki opisujące rozkład wartości poszczególnych kolumn, przydatne w szczególności dla optymalizacji wykorzystania indeksów. Z tego co udało mi się zorientować modele statystyczne nie są generowane automatycznie i ich sporządzenie należy do administratora bazy. Przez sporządzenie rozumiem tu oczywiście odpalenie odpowiednich skryptów/funkcji w bazie danych :). O ile dobrze pamiętam z wykładu zazwyczaj konfiguruje się bazę tak by sama odpalała takie skrypty co pewien czas ( w okresach małej aktywności bazy np. noc), lub po jakiś większych importach danych. Warto zwrócić uwagę na to, że sama optymalizacja musi być wykonana w bardzo krótkim czasie tak, aby nie stanowiła istotnego narzutu na całość realizacji zapytania. W środowiskach OLTP oznacza to, że optymalizacja nie powinna zabierać więcej czasu niż ułamek sekundy. Jak ktoś chce dowiedzieć się więcej to zachęcam do poczytania tych linków które dałem poniżej :) Bibliografia: http://www.cs.put.poznan.pl/mzakrzewicz/pubs/plsem02.pdf http://en.wikipedia.org/wiki/Query_plan http://en.wikipedia.org/wiki/Query_optimizer 1 i 2 wykład dr. Dydejczyka