Krzysztof Dembczyński Instytut Informatyki Zakład Inteligentnych Systemów Wspomagania Decyzji Politechnika Poznańska Technologie Wytwarzania Oprogramowania Semestr zimowy 2005/06
Plan wykładu Ewolucja systemów baz danych Relacyjne systemy baz danych i język SQL Projektowanie baz danych i ochrona danych Optymalizacja i struktury danych Systemy OLAP I Systemy OLAP II Modelowanie wielowymiarowe Proces ekstrakcji, transformacji i ładowania danych (Proces ETL)
Plan wykładu 1 Dostęp do danych 2 Indeksy 3 Tablice haszujace 4 Optymalizacja
Optymalizacja jest siła systemów relacyjnych baz danych. Pozwala na opracowanie optymalnego dostępu do danych bez bezpośredniego udziału użytkownika. Odpowiednio przygotowane struktury danych przyspieszaja operacje dostępu do danych.
Plan wykładu 1 Dostęp do danych 2 Indeksy 3 Tablice haszujace 4 Optymalizacja
Dostęp do danych Dostep do danych jest realizowany przez: menedżer dysku, menedżer plików, SZBD. Ważnym elementem jest położenie rekordów (rekordów z punktu widzenia systemu przechowywania danych).
Struktury danych Najważniejsze struktury danych: indeksy (różne odmiany, w szczególności B-drzewa), haszowanie (tablice haszujace), Łańcuchy wskaźników. Często stosuje się kompresję danych.
Plan wykładu 1 Dostęp do danych 2 Indeksy 3 Tablice haszujace 4 Optymalizacja
Indeksy Podstawowa metoda przyśpieszania dostępu do danych. Przypominaja w pewien sposób indeksy w ksiażkach. Indeks jest zakładany na atrybucie relacji atrybut ten nosi nazwę atrybutu indeksowego. Definicja Indeks jest to uporzadkowany plik rekordów o stałej długości i o dwóch polach: wartość pola indeksowanego (atrybutu, który indeksujemy), wskaźnik na blok + przesunięcie w bloku (lub wskaźnik na adres bloku).
Przykład indeksu
Indeks podstawowy Indeks podstawowy jest zakładany na atrybucie, który jest unikalny i porzadkuj acy. Plik z relacja jest uporzadkowany wg. atrybutu porzadkuj acego. Kolejne wskaźniki indeksów odpowiadaja poczatkom kolejnych bloków. Jest to tzw. indeks rzadki (tzn. liczba rekordów indeksu odpowiada liczbie bloków pliku wskażniki sa do bloków, a nie do rekordów). Taki indeks można przeszukiwać binarnie.
Indeks wtórny Pole, na którym zakładany jest indeks wtórny jest polem nieporzadkuj acym i nazywamy je polem indeksowanym. Może istnieć wiele indeksów wtórnych dla pojedynczej relacji. Indeks wtórny jest indeksem gęstym jednemu rekordowi indeksu odpowiada jeden rekord pliku danych. Taki indeks można przeszukiwać binarnie. Indeks ten jest wydajniejszy, ale zajmuje więcej pamięci.
Indeks wielopoziomowy Polega na indeksowaniu indeksów :) Indeks jest indeksowany w sposób rzadki (dlaczego?). Taka struktura redukuje znacznie czas przeszukiwania. Problemem jest wstawianie i usuwanie rekordów (odpowiedź B-drzewa).
B-drzewa Nazwa pochodzi od angielskiego słowa balanced, czyli zrównoważony. Wskaźniki do bloków danych znajduja się wyłacznie w wierzchołkach liści drzewa. Oznacza to, że liście i wierzchołki wewnętrzne drzewa posiadaja różna strukturę (jest to tzw. B + -drzewo). W ogólności B-drzewo rzędu n zawiera co najmniej n, ale nie więcej niż 2n wartości danych w dowolnym węźle. Jeżeli zawiera k danych, to również zawiera k + 1 wskaźników.
Wstawianie wartości do B-drzewa Najpierw stosujemy algorytm wyszukiwania do znaleznienia węzła nie w zbiorze sekwencyjnym, ale węzła w zbiorze indeksowym, na najniższym poziomie, do którego V (wstawiana wartość) logicznie należy. Nazwijmy go N. Jeśli w N jest jeszcze wolne miejsce to wstawiamy V i proces się kończy.
Wstawianie wartości do B-drzewa W przeciwnym przypadku, który występuje, gdy węzeł N zawiera już 2n wartości dzielimy go na dwa węzły N1 i N2. Niech S oznacza poczatkowe 2n wartości plus nowa wartość V, w ich logicznej kolejności. N poczatkowych wartości w S zostanie umieszczonych w N1, n końcowych w N2, a wartość środkowa powiedzmy W, awansuje do węzła P będacego rodzicem dla N na wyższym poziomie. Będzie tam służyć za wartość graniczna oddzielajac a węzeł N1 od N2. Późniejsze wyszukiwanie wartości U, po dojściu do węzła P, zostanie skierowane do węzła N1, jeśli U W, lub do węzła N2, gdy U > W.
Wstawianie wartości do B-drzewa Dalej następuje próba wstawienia W do P i cały proces powtarza się
Usuwanie i zmiana wartości w B-drzewie Algorytm usuwania wartości z B-drzewie jest w zasadzie odwrotnościa algorytmu wstawiania. Zmiana wartości jest obsługiwana prez usunięcie starej wartości i wstawienie nowej.
Plan wykładu 1 Dostęp do danych 2 Indeksy 3 Tablice haszujace 4 Optymalizacja
Haszowanie Jest to próba takiego przechowywania danych, by sama struktura ułatwiała swobodny dostęp do plików. Tablica haszowa umożliwia zwiększanie efektywności wykonywania niektórych operacji na relacjach. Tablica taka posiada M szczelin, w których przechowywanych jst R adresów bloków dyskowych zawierajacych rekordy pliku relacji. Adres bloku dyskowego otrzymuje sie w oparciu o wartość pola haszowego. Pliki wykorzystujace ta technikę nazywane sa haszowanymi lub bezpośrednimi.
Haszowanie Idea polega na zdefiniowaniu funkcji haszowej, która zastosowana do pola haszowego zwraca adres bloku dyskowego, w którym znajduje się poszukiwany rekord. Najczęściej spotyka się funkcję: h(k ) = KmodM. Pola nienumeryczne sa transformowane do liczb całkowitych przed zastosowaniem funkcji haszowej. Niestety problemem sa kolizje!
Proces znajdowania innej lokalizacji dla danego rekordu nosi nazwę rozwiazywania kolizji: np. adresowanie otwarte: jeżeli dana lokacja jest zajęta, weź następna wolna. łańcuchowanie: tablicę dzielimy na przestrzeń adresowa i przestrzeń przepełnienia. Każda lokacja posiada wskaźnik przepełnienia, który domyślnie wynosi -1. Gdy nastapi kolizja, to wybieramy pierwsza wolna szczelinę z przestrzeni przepełnienia, a adres tej szczeliny wstawiamy do pola wskaźnika szczeliny, gdzie nastapiła kolizja, i inne...
Plan wykładu 1 Dostęp do danych 2 Indeksy 3 Tablice haszujace 4 Optymalizacja
Optymalizacja Optymalizacja zapytań polega na znalezieniu optymalnego stanu w przestrzeni stanów zawierajacej wszystkie możliwe plany wykonania danego zapytania. Stan optymalny jest to stan o najmniejszej wartości funkcji kosztu.
Optymalizacja Cztery zasadnicze etapy optymalizacji obejmuja: przekształcenie zapytania do jakiejś wewnętrznej postaci (zwykle do postaci drzewa zapytania albo abstrakcyjnego drzewa składniowego - reprezentacje takie można uważać za szczególne postacie algebry relacyjnej), przekształcenie do postaci kanonicznej za pomoca różnych praw transformacji, wybór kandydatów do procedur niskiego poziomu, implementujacych różne operatory występujace w kanonicznej postaci zapytania, utworzenie planów realizacji zapytania i wybór najtańszego z nich za pomoca wzorów kosztów i znajomości statystyki bazy danych.
Optymalizacja Optymalizator zapytań jest charakteryzowany przez: reguły transformacji służace do generowania przestrzeni stanów dla danego zapytania, algorytm przeszukiwania przestrzeni pozwalajacy na przechodzenie między poszczególnymi stanami, funkcja kosztu, która jest stosowana do każdego ze stanów (w bazie danych przechowywane sa statystyki ułatwiajace obliczenie tej funkcji).
Optymalizacja Przykład SELECT SNAME FROM SP, S WHERE SP.S# = S.S# AND SP.P# = P2 ; Przypuśmy, że baza danych obejmuje 100 dostawców (S) i 10000 dostaw (SP), z których tylko 50 dotyczy produktu P2. Jak należy wykonać powyższe zapytanie?
Optymalizacja Implementacja operacji selekcji: przeszukiwanie liniowe, przeszukiwanie binarne, zastosowanie indeksów, zastosowanie tablicy haszujacej.
Optymalizacja Implementacja operacji połaczenia: zagnieżdżona pętla - wybierz jeden plik jako zewnętrzny, a drugi jako wewnętrzny. Dla każdego pobranego rekordu z pliku zewnętrzenego odczytuj po kolei wszystkie rekordy pliku wewnętrznego i dla kazdych dwóch rekordów sprawdź warunek połaczenia, bezpośrednie ścieżki dostępu dla dopasowania rekordów, algorytm Sort-Merge, algorytm Hash-join. Dwa źródła złożoności: operacje I/O oraz operacje Obliczeniowe (procesora).
Zagnieżdżona pętla Zagnieżdżona pętla for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (R[i].C = S[j].C) result(r[i].c,s[j].c);
Analiza algorutmu zagnieżdżonej pętli Przypuśćmy, że zewnętrzna tabela ma m krotek, a wewnętrzna ma n krotek: złożoność obliczniowa O(m n) każda krotkę z relacji zewnętrznej należy porównać z każda krotka z relacji wewnętrznej, złożoność I/O: zależy od wielkości dostępnej pamięci, możliwe sa cztery scenariusze (przy załóżeniu B krotek na stronę pamięci), wykorzystanie 2 stron pamięci, wykorzystanie (m/b + n/b) stron pamięci, wykorzystanie (n/b + 1) stron pamięci, wykorzystanie (k + 1) stron pamięci, dla k < m B.
Zagnieżdżona pętla: dwie strony pamięci Jedna strona dla tabeli zewnętrznej i jedna strona dla tabeli wewnętrznej. Przebieg algorytmu: Załaduj pierwszy blok do pamięci tabeli zewnętrznej, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim, Załaduj drugi blok do pamięci tabeli zewnętrznej, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim,..., Załaduj (m/b) blok do pamięci tabeli zewnętrznej, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim, Koszt algorytmu: koszt = m/b (n/b + 1)
Zagnieżdżona pętla: m/b + n/b stron pamięci Załaduj obydwie tabeli w całości do pamięci operacyjnej. Wszystkie obliczenia odbywaja się w pamięci operacyjnej. Nie potrzebne operacje ładowania stron do pamięci. Koszt algorytmu: koszt = m/b + n/b Wymaga bardzo dużej ilości pamięci stosowane, gdy tablice wejściowe sa małe.
Zagnieżdżona pętla: n/b + 1 stron pamięci Zarezerwuj jedna stronę dla tabeli zewnętrznej. Załaduj cała tabelę wewnętrzna do pamięci operacyjnej (n/b bloków). Przebieg algorytmu: Załaduj cała tabelę wewnętrzna do pamięci, Załaduj pierwszy blok tabeli zewnętrznej do pamięci, Tabela wewnętrzna jest już w pamięci nie potrzebna operacja I/O, Załaduj drugi blok tabeli zewnętrznej do pamięci, Tabela wewnętrzna jest już w pamięci,..., Załaduj (m/b) blok tabeli zewnętrznej do pamięci, Tabela wewnętrzna jest już w pamięci. Koszt algorytmu: koszt = m/b + n/b (podobnie jak na poprzednim slajdzie). Stosowane praktycznie, gdy tablica wewnętrzna jest mała.
Zagnieżdżona pętla: k + 1 stron pamięci Zarezerwuj jedna stronę dla tabeli wewnętrznej. Załaduj k stron tabeli zewnętrznej do pamięci operacyjnej. Przebieg algorytmu: Załaduj pierwszych k bloków tabeli zewnętrznej do pamięci, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim, Załaduj drugie k bloków tabeli zewnętrznej do pamięci, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim,..., Załaduj (m/kb) k bloków tabeli zewnętrznej do pamięci, Załaduj wszystkie (n/b) bloki tabeli wewnętrzej, jeden po drugim, Koszt algorytmu: koszt = m/(kb) (n/b + k) Poprawa złożoności I/0 o współcznynnik k.
Podsumowanie analizy zagnieżdżonej pętli Złożonośc obliczeniowa O(m n), Złożoność I/O zależy od ilości zarezerwowanej pamięci na operację łaczenia, Jeżeli jedna z tabel jest mała to: mniejsza tabelę ustaw jako wewnętrzna, złożoność I/O jest O(m/B + n/b), zależność jest liniowa minimalna z możliwych. w przeciwnym przypadku: mniejsza tabelę ustaw jako zewnętrzna (trochę lepiej niż na odwrót), złożoność I/O jest O(m/(kB) (n/b + k)).
Transformacja wyrażeń Przykłady: SELECT DISTINCT SNAME FROM S WHERE S = S1 jest równoważne SELECT DISTINCT SNAME FROM (SELECT * WHERE S = S1 ) Załóżmy, że A i B sa atrybutami w dwóch różnych relacjach: A > B AND B > 3 jest równowazne A > 3 AND B > 3 AND A > B
Plan wykładu Ewolucja systemów baz danych Relacyjne systemy baz danych i język SQL Projektowanie baz danych i ochrona danych Optymalizacja i struktury danych Systemy OLAP I Systemy OLAP II Modelowanie wielowymiarowe Proces ekstrakcji, transformacji i ładowania danych (Proces ETL)