Indeksowanie: BB-drzewa Fizyczna struktura bazy danych Indeksy Tadeusz Pankowski Optymalizacja www.put.poznan.pl/~tadeusz.pankowski T. Pankowski/A. Stachowiak 1 Fizyczna struktura bazy danych 2 Fizyczna struktura bazy danych (c.d.) • Techniki używane do przechowywania dużej ilości ustrukturalizowanych danych na dysku mają wpływ na: projektowanie baz, administrowanie oraz implementację systemów SZBD • Proces fizycznego projektowania bazy danych związany jest z wyborem, spośród opcji oferowanych przez SZBD, takiej techniki organizacji danych, która będzie najlepiej odpowiadała wymaganiom aplikacji • Potrzebne dane muszą zostać jak najsprawniej zlokalizowane na dysku, skopiowane do pamięci głównej, a następnie, po przetworzeniu, z powrotem zapisane na dysku T. Pankowski/A. Stachowiak T. Pankowski/A. Stachowiak 3 Trwałe dane w bazie danych są przechowywane w pamięci zewnętrznej z trzech powodów: ze względu na rozmiar bazy danych, odporność pamięci zewnętrznej na awarie, koszt jednostkowy. Pamięć zewnętrzna ma organizację plikową, oznacza to, że jednostką alokacji na dysku jest plik. T. Pankowski/A. Stachowiak 4 Fizyczna struktura bazy danych (c.d.) Fizyczna struktura bazy danych (c.d.) • Dane przechowywane na dysku są zorganizowane w pliki rekordów. Każdy rekord składa się z pól przechowujących wartości. • Organizacja pliku określa sposób uporządkowania rekordów w pliku przechowywanym na dysku. Wybór właściwej organizacji zależy od sposobu użytkowania danego pliku i jest zadaniem administratora BD. • Podstawowe metody organizacji plików: • plik stertowy (heap file) – dopisuje nowe rekordy na końcu pliku • plik posortowany (sorted file) – zachowuje uporządkowanie rekordów według wartości określonego pola • plik mieszający (hash file) – wykorzystuje funkcję mieszającą stosowaną względem określonego pola w celu określenia miejsca umieszczenia rekordu na dysku • Pomocnicze struktury dostępu: B-drzewa, indeksy T. Pankowski/A. Stachowiak • Rekordy mogą mieć stałą lub zmienną długość. • Stała długość oznacza, że rekord zawsze zajmuje tyle samo miejsca na dysku, niezależnie od rzeczywistych rozmiarów przechowywanych w nim danych. • Rekordy o zmiennej długości przyjmują taki rozmiar jaki faktycznie przyjmują przechowywane w nich dane. • Na poziomie dyskowym, rekordy są przechowywane w blokach dyskowych (strony, page). Rozmiar tych bloków jest określany przez system operacyjny (zwykle 0.5KB-8KB). • Rekordy pliku muszą być przydzielane do bloków dyskowych, ponieważ blok jest jednostką przesyłania danych między dyskiem a pamięcią 5 Fizyczna struktura bazy danych (c.d.) 6 Fizyczna struktura bazy danych (c.d.) • Organizacja segmentowana (spanned): • pozwala przechowywać część rekordu w jednym bloku, a resztę w drugim. Wskaźnik znajdujący się na końcu pierwszego bloku wskazuje na blok, w którym znajduje się reszta rekordu, jeżeli nie jest to następny blok w kolejności • Organizacja niesegmentowana (unspanned): • Alokacja ciągła: • bloki pliku są alokowane na kolejnych blokach dysku; odczyt pliku jest bardzo szybki, ale utrudnia rozszerzanie pliku • Alokacja łączona: • każdy blok pliku zawiera wskaźnik na następny blok pliku • Alokacja klastrów: • kombinacja dwóch poprzednich rozwiązań; kolejne bloki łączone są w klastry i zawierają wskaźnik na następny klaster • nie zezwala, aby rozmiar rekordu był większy niż rozmiar bloku T. Pankowski/A. Stachowiak T. Pankowski/A. Stachowiak • Alokacja indeksowa: • bloki indeksu zawierają wskaźnik na faktyczne bloki pliku 7 T. Pankowski/A. Stachowiak 8 Fizyczna struktura bazy danych (c.d.) Fizyczna struktura bazy danych (c.d.) • Metoda organizacji pliku odnosi się do rozmieszczenia danych pliku w ramach rekordów, bloków i struktur dostępu. • W celu wyszukania rekordu na dysku jeden lub większa liczba bloków zostaje skopiowana do buforów pamięci głównej. Następnie w buforach wyszukiwany jest potrzebny rekord lub rekordy. Jeżeli adres bloku zawierającego rekord nie jest znany, przeszukiwanie musi być liniowe. Każdy blok pliku zostaje skopiowany do bufora i przeszukiwany do momentu znalezienia rekordu lub przeszukania wszystkich bloków. • Celem poprawnej organizacji plików jest możliwość lokalizowania bloku zawierającego potrzebny rekord w jak najmniejszej liczbie operacji przesyłania bloków. 9 T. Pankowski/A. Stachowiak Fizyczna struktura bazy danych (c.d.) • SQL Server zapisuje dane (rekordy, rows) w 8 KB (=8192B) ciągłych obszarach przestrzeni nazywanych stronami (ang. Page). • Strony łączone są w większe struktury nazywane zakresami (ang. Extent). Każdy zakres składa się z 8 stron, czyli zawiera 64 KB danych. Tabele i indeksy zapisywane są w zakresach, przy czym małe obiekty mogą dzielić ten sam zakres. Poszczególne wiersze tabel oraz dane indeksów wraz z metadanymi przechowywane są na stronach (ogranicza to ich rozmiar). T. Pankowski/A. Stachowiak 11 • Metoda dostępu to grupa operacji (znajdź, odczytaj, zmodyfikuj, wstaw, zamknij i inne), które można stosować względem pliku; niektóre metody dostępu mogą być stosowane tylko dla określonej metody organizacji plików • Techniki metod dostępu: • szeregowanie, • mieszanie (hash-owanie), • indeksowanie T. Pankowski/A. Stachowiak 10 Fizyczna struktura bazy danych (c.d.) • Maksymalna liczba danych zapisanych na pojedynczej stronie wynosi 8060 bajtów • Pojedynczy wiersz nie może zostać zapisany na kilku stronach. Wynika z tego, że wielkość pojedynczego wiersza nie może przekroczyć 8060 bajtów T. Pankowski/A. Stachowiak 12 Fizyczna struktura bazy danych (c.d.) Fizyczna struktura bazy danych (c.d.) CREATE DATABASE nazwa [ON [PRIMARY] [<plik> [,…n]] [, <grupa_plików> [,…n]] ] [LOG ON {<plik> [,…n]}] [COLLATE porządek] [FOR LOAD | FOR ATTACH] • Baza danych zapisana jest przynajmniej w dwóch plikach: • W głównym pliku .mdf (główny plik danych), w którym zapisane są informacje o strukturze bazy oraz wszystkie wiersze poszczególnych tabel i indeksy. • W pliku .ldf (plik rejestru transakcji), w którym zapisany jest dziennik transakcyjny bazy danych • Można (a nawet należy) zapisywać bazę w większej liczbie plików – dane mogą zostać podzielone między dowolną liczbę plików .ndf (pliki dodatkowe) gdzie: <plik> ::= ([NAME = nazwa_logiczna,] FILENAME = 'nazwa_fizyczna' [, SIZE = wielkość] [, MAXSIZE = {maksymalna_wielkość | UNLIMITED}] [, FILEGROWTH = przyrost]) [,…n] <grupa_plików> ::= FILEGROUP nazwa <plik> [,…n] T. Pankowski/A. Stachowiak 13 14 Fizyczna struktura bazy danych (c.d.) Fizyczna struktura bazy danych (c.d.) • Usuwanie bazy danych DROP DATABASE nazwaBD [, nazwaBD,...] • Rozbudowa bazy danych ALTER DATABASE nazwaBD (...) • sp_dboption – procedura pozwala wyświetlić lub zmienić ustawienia konfiguracyjne bazy danych • sp_databases – lista wszystkich baz danych na serwerze • sp_helpdb [nazwa_bazy] – informacja o wszystkich bazach na bieżącym serwerze [informacja o konkretnej bazie] CREATE DATABASE wydawnictwo ON PRIMARY (NAME = wydawnictwo_dane1, FILENAME = 'C:\wydawnictwo\wydawnictwo_dane1.mdf', SIZE = 5MB, MAXSIZE = 20MB, FILEGROWTH = 20%), (NAME = wydawnictwo_dane2, FILENAME = 'C:\wydawnictwo\wydawnictwo_dane2.ndf', SIZE = 1MB, MAXSIZE = 20MB, FILEGROWTH = 20%) LOG ON (NAME = wydawnictwo_dziennik, FILENAME = 'C:\wydawnictwo\wydawnictwo_dziennik.ldf') T. Pankowski/A. Stachowiak T. Pankowski/A. Stachowiak 15 T. Pankowski/A. Stachowiak 16 Indeksy Indeksy (c.d.) • Indeks jest pomocniczą strukturą używaną w celu przyspieszenia dostępu do żądanych rekordów pliku. Konstruowany jest w oparciu o pole indeksujące. • Do konstrukcji indeksu można użyć dowolnego pola, jak również dla jednego pliku można stworzyć wiele indeksów. • Najczęściej używane rodzaje indeksów: • jednopoziomowe, bazujące na plikach uporządkowanych • wielopoziomowe, bazujące na strukturach drzewiastych T. Pankowski/A. Stachowiak 17 Indeksy (c.d.) T. Pankowski/A. Stachowiak 18 Indeksy (c.d.) • Zalety: optymalizacja zapytań - jeżeli istnieją powiązane z tabelą indeksy, znalezienie żądanych danych sprowadza się do znalezienia w indeksie (który z reguły jest obiektem wielokrotnie mniejszym niż tabela) wierszy tabeli spełniających podane kryteria i odczytania wyłącznie tych stron, na których zostały zapisane znalezione wiersze; • Wady: indeksy mogą spowalniać operacje wstawiania, usuwania i modyfikacji danych T. Pankowski/A. Stachowiak • Powodem tworzenia indeksów jest poprawa wydajności bazy danych. • Indeksy, podobnie jak statystyki, nie wpływają na wynik zapytania, a jedynie na plan i koszt jego wykonania. • Jeżeli nie istnieją indeksy, wyszukanie pojedynczego wiersza tabeli wiąże się z koniecznością odczytania wszystkich stron, na których tabela została zapisana 19 • Strukturę indeksu definiuje się zazwyczaj dla jednego pola pliku, zwanym polem (atrybutem) indeksującym • Wartości w indeksie są uporządkowane, dzięki czemu można na nich wykonywać wyszukiwanie binarne (przez połowienie) • Rodzaje indeksów uporządkowanych: • indeks główny, określany na polu klucza (unikatowym), według którego plik jest fizycznie porządkowany • indeks klastrowania (grupujący), dla pól porządkujących, ale nie koniecznie unikatowych • indeks drugorzędny, określony dla pola nieporządkującego T. Pankowski/A. Stachowiak 20 Indeksy (c.d.) Indeks główny • Indeks zagęszczony (dense index) zawiera wpis dla każdej wartości klucza wyszukiwania znajdującej się w pliku danych (a więc dla każdego rekordu) (np. indeks drugorzędny) • Indeks rzadki, niezagęszczony (sparse index, nondense) – posiada wpisy tylko dla niektórych wartości wyszukiwania (np. indeks główny) T. Pankowski/A. Stachowiak 21 Indeks główny – przykład Plik indeksu Ala Danuta Helena ... Plik danych • Dla każdego bloku danych przypada jeden wpis (rekord) indeksu • Rekord, którego wartość klucza wynosi K, gdzie K(i)≤K<K(i+1) znajduje się zatem w bloku, którego adresem jest P(i), (rekordy są fizycznie uporządkowane ze względu na wartość pola klucza) T. Pankowski/A. Stachowiak 22 Załóżmy, że mamy plik uporządkowany względem pola klucza liczący r = 30 000 rekordów, przechowywany na dysku o rozmiarze bloku 1024 bajty. Rekordy pliku mają stały rozmiar R=100 bajtów (i są niesegmentowane). Ile dostępów do bloku wymaga wyszukanie binarne? Rozwiązanie: W bloku mamy 1024/100 = 10 rekordów. Liczba wymaganych bloków wynosi zatem 30 000/10 = 3000. Przeszukanie binarne wymaga około log23000=12 operacji dostępu do bloku. Załóżmy teraz, że pole klucza ma długość V=9 bajtów. Na tym polu utworzono indeks główny, wskaźnik na blok ma 6 bajtów. Jaki zysk otrzymamy stosując indeks? Rozmiar każdego wpisu indeksu wynosi 9+6=15, zatem w jednym bloku mieści się 1024/15=68 wpisów. Całkowita liczba wpisów indeksu jest równa liczbie bloków pliku z danymi, a więc 3000. Potrzebujemy zatem 3000/68=45 bloków. Przeszukiwanie binarne na pliku indeksu wymaga zatem log245=6 dostępów do bloków. Plus 1 dostęp do bloku danych, a więc 7 operacji dostępu. Ala Beata Celina Czesława Danuta Dorota Franciszka Grażyna Helena Irena Joanna Katarzyna T. Pankowski/A. Stachowiak • wartość pola klucza - K(i) • wskaźnik na blok dyskowy zawierający rekord o tej wartości pola klucza - P(i) Indeks główny – zadanie 1 Imię (pole klucza głównego) Wartość klucza Wskaźnik P(i) głównego K(i) na blok • Indeks główny to plik uporządkowany z rekordami o stałej długości posiadającymi dwa pola zawierające: 23 T. Pankowski/A. Stachowiak 24 Indeks grupujący Indeks grupujący – przykład Plik indeksu • Jeżeli rekordy pliku są fizycznie posortowane według pola nie będącego polem klucza (a więc takiego, dla którego wartości mogą się powtarzać), to pole to określa się mianem pola klastrowania i można utworzyć na nim indeks grupujący (klastrowania). • Indeks ten również składa się z dwóch pól: Numer (pole klastrowania) 1 1 1 2 1 3 ... 1 2 2 3 Wskaźnik na blok, indeksu zgrupowanego, zawiera adres bloku danych, w którym znajduje się pierwszy rekord danych z wartością atrybutu indeksowego równą wartości pola grupowania 25 Indeks drugorzędny 3 3 3 3 T. Pankowski/A. Stachowiak 26 Indeks drugorzędny – przykład Plik indeksu Plik danych Numer (pole klucza drugorzędnego) • Indeks drugorzędny (wtórny) jest dodatkowym mechanizmem, i tworzony jest na polu, które nie porządkuje danych, i które może mieć zarówno wartości unikalne jak i powtarzające się • Sam indeks posiada wartości uporządkowane o dwóch polach: Wartość pola indeksu K(i) 1 2 3 4 5 • wartość pola indeksującego • wskaźnik na rekord lub na blok (różne wersje) T. Pankowski/A. Stachowiak 1 Wartość pola Wskaźnik P(i) klastrowania K(i)na blok • wartość pola klastrowania (po jednym wpisie dla każdej odrębnej wartości) • wskaźnik na pierwszy blok w pliku danych zawierający rekord o danej wartości pola klastrowania T. Pankowski/A. Stachowiak Plik danych 6 7 8 9 10 27 Wskaźnik P(i) na blok 11 2 3 12 5 4 10 6 Każdy rekord pliku danych posiada swój odpowiednik w rekordzie indeksu. Stąd, indeks wtórny jest indeksem gęstym. 7 1 8 9 T. Pankowski/A. Stachowiak 28 Indeks drugorzędny – zadanie 2 Indeks drugorzędny dla pola o powtarzających się wartościach – przykład Plik indeksu Rozważmy przykład jak w zadaniu 1. Plik posiada 3000 bloków o rozmiarze 1024, gdzie wpisano 30 000 rekordów o rozmiarze 100 bajtów każdy. Ponieważ pole, po którym wyszukujemy nie jest uporządkowane, aby znaleźć żądaną wartość należy przeprowadzić wyszukiwanie liniowe, a więc wykonać średnio 3000/2 = 1500 operacji dostępu do bloków. Załóżmy, że skonstruowaliśmy indeks drugorzędny. Podobnie jak w zadaniu 1 każdy wpis ma rozmiar 9+6=15 bajtów, a zatem w jednym bloku znajduje się 1024/15=68 wpisów. Całkowita liczba wpisów w indeksie jest równa liczbie rekordów w pliku danych (wartości pola są unikalne), a więc wynosi 30 000. Indeks musi zatem zajmować 30 000/68=442 bloki. Przeszukanie binarne takiego pliku wymaga log2442=9 operacji dostępu do bloku, plus 1 operacja dostępu do bloku danych, a więc w sumie 10 operacji, co jest znacznym usprawnieniem. Wartość pola indeksu K(i) Wskaźnik P(i) na blok Blok wskaźników na rekordy Plik danych Numer (pole indeksowania) 1 1 1 2 2 5 3 4 2 5 3 2 5 3 4 1 4 T. Pankowski/A. Stachowiak 29 Indeksy wielopoziomowe 30 Indeks wielopoziomowy – zadanie 3 • Indeks wielopoziomowy powstaje na bazie uporządkowanego pliku indeksu o odrębnych wartościach dla każdego K(i), który teraz określany jest jako zerowy (lub podstawowy) poziom indeksu. Dla niego tworzony jest indeks główny, który staje się pierwszym poziomem indeksu. Proces ten jest powtarzany do momentu, aż wszystkie wpisy indeksu na pewnym poziomie t zmieszczą się w jednym bloku. Ten poziom określa się jako szczytowy. • Wysokość t = logf0r, gdzie r jest liczbą wpisów na poziomie podstawowym, a f0 – liczbą wpisów na jeden blok. Wyszukiwanie w takim pliku jest szybsze niż wyszukiwanie binarne, jeżeli f0>2. T. Pankowski/A. Stachowiak T. Pankowski/A. Stachowiak 31 Załóżmy, że zagęszczony indeks drugorzędny z zadania 2 został zamieniony na indeks wielopoziomowy. Obliczyliśmy współczynnik blokowy pliku f0= 68 wpisów na blok i stanowi on jednocześnie obciążenie wyjściowe dla indeksu wielopoziomowego. Liczba bloków na poziomie podstawowym wynosiła r=442. Liczba bloków poziomu pierwszego wyniesie zatem 442/68=7 bloków, a na poziomie drugim: 7/68=1 blok. Zatem t=log68442= 2. W celu uzyskania dostępu do żądanego rekordu poprzez przeszukanie indeksu wielopoziomowego musimy uzyskać dostęp do jednego bloku na każdym poziomie oraz jednego bloku w pliku danych, a więc 3+1=4 operacje dostępu do bloków. T. Pankowski/A. Stachowiak 32 Drzewa Drzewa wyszukiwania Drzewo – oznacza w teorii grafów graf, który jest acykliczny i spójny. korzeń Węzeł wewnętrzny Poziom 0 0 1 2 4 5 Poziom 1 3 6 7 • Drzewo wyszukiwania stanowi specjalny rodzaj drzewa używanego w celu sterowania procesem wyszukiwania rekordu. Indeksy wielopoziomowe można postrzegać jako odmianę drzew wyszukiwania. • Drzewo wyszukiwania rzędu p jest takim drzewem, że każdy wierzchołek zawiera co najwyżej p-1 wartości wyszukiwania oraz p wskaźników na poddrzewo: <P1, K1, P2, K2, ..., Pq-1, Kq-1, Pq>, gdzie q ≤ p. • Każde Pi oznacza wskaźnik na poddrzewo (lub wsk.pusty), a każde Ki jest wartością wyszukiwania z uporządkowanego zbioru wartości (zakłada się, że wartości są unikatowe) 8 Poziom 2 liść poddrzewo Drzewo T. Pankowski/A. Stachowiak 33 Drzewa wyszukiwania (c.d.) X < K1 K1 ... Ki-1 Pi Ki ... Kq-1 Ki-1 < X < Ki T. Pankowski/A. Stachowiak Pq 34 B-drzewa • w każdym wierzchołku K1 < K2 < ... < Kq-1 • dla wszystkich wartości X w poddrzewie, na które wskazuje wskaźnik Pi zachodzi: Ki-1 < X < Ki P1 T. Pankowski/A. Stachowiak ... Kq-1 < X 35 • B-drzewo (perfectly balanced multiway tree) jest drzewem wyszukiwania o dodatkowych ograniczeniach, które zapewniają, że jest ono zawsze w pełni zrównoważone oraz stopień wypełnienia nie jest nigdy zbyt mały. (Komplikuje to oczywiście algorytmy wstawiania i usuwania, ale przyspiesza wyszukiwanie) • Stanowi ono podstawę implementacji indeksów w SZBD. • Drzewo skierowane T nazywamy B-drzewem klasy t(h, m), jeśli h = 0 (drzewo puste) lub · Wszystkie drogi od korzenia do liści są długości h, · Każdy wierzchołek z wyjątkiem korzenia ma, co najmniej m kluczy (elementów) i m+1 synów, · Każdy wierzchołek ma, co najwyżej 2m kluczy (i 2m+1 synów), · Korzeń ma, co najmniej jeden klucz. T. Pankowski/A. Stachowiak 36 B-drzewa (c.d.) B-drzewa (c.d.) • Struktura strony (wierzchołka) w B-drzewie: <P0, <K1, Pr1>, P1, <K2, Pr2>, ... , <Kq, Prq>, Pq> gdzie Ki jest wartością wyszukiwania, Pi jest wskaźnikiem poddrzewa, a Pri jest wskaźnikiem danych, 1≤ ≤ q ≤ 2m dla korzenia, i m ≤ q ≤ 2m dla wierzchołków i liści. W każdym wierzchołku K1 < ... < Kq, Pi - wskaźnik na wierzchołek będący synem lub NIL, <Ki, Pri> indeks. Ki-1 | Pi-1 | Ki | Pi | Ki+1 Ki-1 < X < Ki Ki < X < Ki+1 schemat uporządkowania kluczy. T. Pankowski/A. Stachowiak 37 B-drzewa (c.d.) Operacje na indeksie zorganizowanym według struktury B-drzewa Dołączanie • metoda podziału • metoda kompensacji Chcemy dołączyć element indeksu o kluczu X, tak aby nie naruszyć struktury B-drzewa. Dołączanie poprzedzone jest procedurą SZUKAJ, w wyniku której, albo znajdziemy wierzchołek zawierający klucz X (koniec) albo znajdziemy adres wierzchołka (liścia) do którego należy dołączyć klucz X. Jeśli wierzchołek ma mniej niż 2m elementów to dołączamy nowy klucz. Jeśli wierzchołek ma 2m elementów to następuje tzw. kolizja (przepełnienie, nadmiar), którą rozwiązujemy albo metodą podziału albo metodą kompensacji. T. Pankowski/A. Stachowiak 38 B-drzewa (c.d.) Likwidacja nadmiaru a) metoda podziału 2m+1 elementów dzielimy na trzy części. Elementy 1, ... , m umieszczamy w wierzchołku 1 Element m+1 przenosimy do strony ojca Elementy m+2, ... , 2m+1 umieszczamy w wierzchołku 2 (rys.1) Przykład 1. m = 2 b) metoda kompensacji: można ją stosować jeżeli sąsiednia strona zawiera j<2m elementów. Stan wyjściowy – rys 1, j=2<2m, obliczamy i=entier((2m+j+3)/2) = ((4+2+3)/2) = 4. Elementy 1, 2, ..., i-1 umieszczamy w wierzchołku1, Element i przenosimy do strony ojca, Elementy i+1, ..., 2m+j+2 umieszczamy w wierzchołku 2 (rys.2). Rys.2 Jeżeli w stronie ojca nastąpi przepełnienie to algorytm powtarzamy – może wzrosnąć wysokość drzewa. 39 T. Pankowski/A. Stachowiak 40 B-drzewa (c.d.) B-drzewa (c.d.) Usuwanie • metoda łączenia • metoda kompensacji Chcemy usunąć element o kluczu X. Usuwanie podobnie jak dołączanie poprzedzone jest algorytmem wyszukiwania. Procedura SZUKAJ powinna zakończyć się powodzeniem i zwrócić adres (s) wierzchołka (strony) zawierającej klucz X. • Jeśli strona jest liściem to usuwamy indeks o kluczu X. Może wówczas wystąpić niedomiar, który usuwamy metodą łączenia lub kompensacji. • Jeżeli strona nie jest liściem to przeglądamy poddrzewo wskazywane przez prawy wskaźnik stojący za kluczem X i szukamy najmniejszego indeksu (L) - idziemy ścieżką wskazywaną przez P0, aż dojdziemy do liścia (rys.3). Ten najmniejszy element wstawiamy w miejsce (X, Pr) a następnie usuwamy go z liścia – może wystąpić niedomiar. T. Pankowski/A. Stachowiak Rys.3 Likwidacja niedomiaru a) metoda kompensacji: jeżeli dla każdej ze stron sąsiednich j+k ≥ 2m to stosujemy metodę kompensacji analogicznie jak przy dołączaniu (j, k – ilość elementów na sąsiednich stronach). 41 T. Pankowski/A. Stachowiak B-drzewa (c.d.) 42 B-drzewa -przykład b) metoda łączenia stosujemy ją jeśli strona s zawiera j<m elementów, a jedna ze stron sąsiednich (s1) zawiera k elementów , przy czym j+k<2m (rys.4). Dane jest B-drzewo klasy t(h, 2) (rys.5): a) wstaw obiekt o kluczu 32 (metodą podziału i metodą kompensacji), b)usuń obiekt o kluczu 46 (metodą łączenia i metodą kompensacji). Rys.4 Rys.5 Na stronie s2 może wystąpić niedomiar, trzeba wówczas operację łączenia powtórzyć, lub jeśli s2 jest korzeniem to przekazujemy go do puli stron pustych (drzewo zmniejszy wysokość). T. Pankowski/A. Stachowiak 43 T. Pankowski/A. Stachowiak 44 B+-drzewa B-drzewa - zadania 1. Oblicz liczbę wierzchołków Wmin i Wmax B-drzewa klasy T(3, 2) odpowiednio przy minimalnym i maksymalnym wypełnieniu drzewa. 2. Oblicz maksymalne (minimalne) zużycie pamięci konieczne na zapamiętanie indeksu w postaci B-drzewa, przy następujących danych: Struktura B+-drzewa jest taka sama jak B-drzewa (zrównoważone, wielodrogowe drzewo wyszukiwań). N = 100 000 - liczba rekordów w pliku głównym, B = 1kB - wielkość bloku, P = 4B - wielkość pola wskaźnikowego, A = 8B - wielkość pola adresowego, X = 20B - wielkość pola klucza indeksowania. W większości komercyjnych systemów baz danych do tworzenia indeksów wykorzystywana jest pewna modyfikacja B-drzew o nazwie B+-drzewa. Różnica polega na tym, że wszystkie indeksowane dane i wskaźniki do rekordy danych przechowywane są w liściach. Wierzchołki pośrednie służą tylko do wyszukiwania danych. Jaka jest wówczas wysokość B-drzewa? T. Pankowski/A. Stachowiak 45 B+-drzewa (c.d.) • • • • 5 7 3 1 3 5 6 7 Liście implementowane są zwykle jako lista. 8 8 46 Indeksy w SQL Server W przypadku B+-drzewa wskaźniki danych są przechowywane tylko w liściach Wierzchołki liści posiadają wpis (indeks ze wskaźnikiem do rekordu danych) dla każdej wartości pola wyszukiwania Niektóre wartości pola wyszukiwania są powtarzane w wierzchołkach wewnętrznych i służą do wspomagania wyszukiwania Koszt wyszukiwania – wysokość drzewa + 1. wskaźnik danych T. Pankowski/A. Stachowiak B+-drzewo dla kluczy: 8, 5, 1, 7, 3, 12, 9, 6 (m=1) 9 1 2 T. Pankowski/A. Stachowiak 47 • SQL Server pozwala na tworzenie indeksów grupujących (klastrujących, ang. Clustered) i niegrupujących (ang. NonClustered) • Indeksy tworzone są w oparciu o strukturę B+-drzewa • SQL Server po utworzeniu indeksu grupującego reorganizuje wszystkie strony tabeli, zapisując wiersze w kolejności określonej przez indeks grupujący (krotki są fizycznie posortowane według atrybutu indeksującego) • Na danej tabeli może zatem istnieć tylko jeden indeks grupujący • Domyślnie na kluczu podstawowym jest tworzony indeks grupujący T. Pankowski/A. Stachowiak 48 Tworzenie indeksu Indeksy w SQL Server (c.d.) • Indeks niegrupujący nie wpływa w żaden sposób na uporządkowanie stron tabeli (uporządkowane są jedynie pozycje samego indeksu). Można ich utworzyć 249. • Indeksy niegrupujące używają indeksu grupującego do pobierania żądanych danych z tabeli, dlatego indeks grupujący należy utworzyć przed utworzeniem indeksów niegrupujących. T. Pankowski/A. Stachowiak 49 Tworzenie indeksu (c.d.) • • • • • • PAD_INDEX oznacza utworzenie indeksu, którego wierzchołki wewnętrzne zostaną zapisane na stronach niewypełnionych w 100%, dzięki czemu dodanie lub modyfikacja danych nie będą oznaczały konieczności przebudowy tego indeksu. Wykorzystywany w połączeniu z FILLFACTOR. Domyślnie SQL Server na każdej stronie indeksu zostawi tyle wolnej przestrzeni, ile wystarcza do zapisania dwóch dodatkowych wierszy indeksu, FILLFACTOR określa procent wolnej przestrzeni na stronach przechowujących wartości liści indeksu, IGNORE_DUP_KEY (opcja dostępna tylko dla indeksów unikatowych) sprawi, że próba wstawienia wartości już istniejącej w jednej z kolumn indeksu unikatowego spowoduje wyświetlenie ostrzeżenia, a naruszająca warunki integralności instrukcja zostanie zignorowana, ale transakcja będzie kontynuowana. Brak tego parametru powoduje przy próbie wstawienia istniejących wartości wyświetlenie komunikatu błędu i wycofanie całej transakcji, DROP_EXISTING zastępuje istniejący indeks nowym o tej samej nazwie, STATISTICS_NORECOMPUTE wyłącza automatyczne aktualizowanie statystyk dla indeksu, SORT_IN_TEMPDB powoduje, że wewnętrzne operacje sortowania danych indeksu będą przeprowadzane w bazie tempdb. Jeżeli baza tempdb znajduje się na osobnym, szybkim dysku, może to spowodować skrócenie czasu sortowania danych 51 T. Pankowski/A. Stachowiak indeksu. CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX indeks ON {tabela (kolumna [ASC | DESC] [,…n]) [WITH [PAD_INDEX] [[,] FILLFACTOR = współczynnik_wypełnienia] [[,] IGNORE_DUP_KEY] [[,] DROP_EXISTING] [[,] STATISTICS_NORECOMPUTE] [[,] SORT_IN_TEMPDB] ] [ON grupa_plików] T. Pankowski/A. Stachowiak 50 Optymalizacja zapytań • Zapytania przed skompilowaniem i wykonaniem są optymalizowane przez wewnętrzny proces SQL Servera o nazwie Query Optimizer. • Jego zadaniem jest znalezienie najtańszego sposobu wykonania instrukcji. • Query Optimizer bazuje na liczbie operacji wejścia-wyjścia oraz na liczbie obliczeń dokonanych przez procesor niezbędnych do wykonania instrukcji. • Query Optimizer szacuje koszt operacji wejścia-wyjścia na podstawie: • struktury tabel i związanych z nimi indeksów • kosztu operacji złączenia • istniejących lub tworzonych dynamicznie statystyk opisujących dane źródłowe • metainformacji opisujących fizyczną strukturę plików, w których zapisane są żądane dane. T. Pankowski/A. Stachowiak 52 Optymalizacja zapytań (c.d.) Optymalizacja zapytań (c.d.) Optymalizacja instrukcji języka T-SQL przebiega następująco: • Sprawdzana jest poprawność syntaktyczna i semantyczna (parse), instrukcja zostanie „podzielona” na znaczniki interpretowane przez SQL Server. • standaryzacja — zapisanie znaczników instrukcji Transact-SQL w jednoznacznej postaci (np. ujednolicenie aliasów) • optymalizacja — wybór jednego z przygotowanych planów wykonania. Na tym etapie następuje analiza indeksów i statystyk oraz metod złączania danych. Etap można podzielić na trzy fazy: • Analiza zapytania — wybór metod wyszukiwania i łączenia danych źródłowych • Wybór indeksów • Wybór metody złączania tabel • Instrukcja wykonana według opracowanego optymalnego planu zostaje skompilowana. • Query Optimizer wybiera optymalny sposób pobrania wybranych (wynikowych) danych. Na przykład: czy odwołać się do indeksu, czy T. Pankowski/A. Stachowiak 53 odczytać tabelę Optymalizacja zapytań (c.d.) T. Pankowski/A. Stachowiak 54 Optymalizacja zapytań (c.d.) Plan wykonania instrukcji oraz wartości pewnych statystyk można poznać: • odczytując zawartość tabeli systemowej SYSINDEXES (nie jest zalecane) • wyświetlając plan wykonania włączając opcje: SET SHOWPLAN TEXT lub SET SHOWPLAN_ALL • wyświetlając statystyki związane z czasem -SET STATISTICS TIME ON • wyświetlając statystyki związane liczbą operacji we/wy SET STATISTICS IO ON • korzystając z przedstawienia graficznego, które zawiera informacje o kolejności wykonywania instrukcji, logicznych operatorach algebry zbiorów użytych podczas wykonywania instrukcji oraz fizycznej implementacji tych operatorów T. Pankowski/A. Stachowiak • Skompilowana według optymalnego planu instrukcja języka Transact-SQL zostaje zapisana w buforze procedury • Ponowna kompilacja instrukcji jest przeprowadzana, jeżeli: • Zmieniona została definicja obiektu, do którego instrukcja się odwołuje (wykonano polecenie ALTER). • Wymuszono aktualizacje statystyk, na podstawie których przygotowany został plan wykonania instrukcji (wykonano instrukcję UPDATE STATISTIC). • Usunięto indeks wykorzystywany przez instrukcję (wykonano instrukcję DROP INDEX). • Z tabeli źródłowej usunięto lub dodano do niej dużą (względem stanu w momencie optymalizacji instrukcji) liczbę wierszy. • Wymuszono rekompilację instrukcji (wywołano procedurę systemową sp_recompile). 55 Informacje związane z liczbą operacji we-wy • scan count – liczba odwołań do tabeli źródłowej • logical reads – liczba odczytanych z pamięci podręcznej stron danych • physical reads – liczba stron danych odczytanych z dysku • read-ahead reads – liczba stron umieszczonych w pamięci podręcznej Współczynnik trafień=(logical reads - physical reads )/ logical reads physical reads<= logical reads T. Pankowski/A. Stachowiak 56 Lista operatorów fizycznych Optymalizacja zapytań (c.d.) Plan wykonania może być przedstawiony w postaci graficznej i zawiera informacje o: • Krokach wykonania zadania i ich kolejności. • Logicznych operatorach algebry relacji, które były wykorzystane podczas wykonania zadnia. • Fizycznej implementacji tych operatorów użytej do wykonania zadania T. Pankowski/A. Stachowiak 57 Plan wykonania T. Pankowski/A. Stachowiak 58 Plan wykonania (c.d.) Ustawiając kursor na symbolu operatora fizycznego uzyskamy dodatkowe informacje o danej operacji: select nazwa from dzialy2 where nazwa = 'ALGORYTMY' argumenty wywołania operacji (ang. Argument), koszt wykonania operacji i jego szacunkowy udział w koszcie wykonania instrukcji (ang. Cost), koszt wykonania operacji i operacji przez nią wywołanych (ang. Subtree cost), create index ix_nazwa on dzialy2(nazwa) liczbę wykonania operacji w ramach instrukcji (ang. Number of executes), liczbę zwróconych przez operacje wierszy (ang. Row count), select nazwa from dzialy2 where nazwa = 'ALGORYTMY' szacunkową wielkość zwróconych przez operacje wierszy (ang. Estimated row size), szacunkowy koszt operacji we-wy (ang. I/O cost), szacunkowy koszt wykorzystania zasobów procesora przez (ang. CPU cost). T. Pankowski/A. Stachowiak 59 T. Pankowski/A. Stachowiak 60 Optymalizacja zapytań (c.d.) Optymalizacja zapytań (c.d.) Optymalna pod względem szybkości odczytu danych jest sytuacja, w której wszystkie żądane dane (wyrażenia wymienione w instrukcji ) mogą zostać odczytane z indeksu. Mówimy wtedy, że indeks zawiera zapytanie. Szczególną grupę stanowią zapytania z operatorami z grupy SARG (ang. Search ARGuments). Nazwa ta określa pewien specjalny podzbiór argumentów wyszukiwania (wymienionych w klauzuli WHERE instrukcji SELECT. Argumenty te charakteryzuje: Obecność stałej, której wartość jest porównywana z polami wybranej kolumny tabeli źródłowej. Wyszukiwanie wartości równych wzorcowi, należących do zakresu wyznaczonego przez wzorzec lub przez połączenie kilku argumentów SARG za pomocą operatora koniunkcji. T. Pankowski/A. Stachowiak 61 Optymalizacja zapytań (c.d.) • Wykonanie zapytania zawierającego argument typu SARG-( =, <, <=, >, >=, BETWEEN oraz, w pewnych przypadkach, LIKE – np. gdy znak % jest na końcu, pozwala to ograniczyć liczbę przeszukiwanych wierszy) przebiega według następującego schematu: • optymalizator sprawdza, czy istnieją przydatne do wykonania zapytania indeksy • jeżeli takie indeksy istnieją, rozpoczyna się wyszukiwanie (za pomocą operatora >=) stron indeksu przechowujących żądane dane • wszystkie wartości spełniające zadane kryteria są odczytywane, a jeśli jest to konieczne, z tabeli odczytywane są pozostałe pola danego wiersza. T. Pankowski/A. Stachowiak 62 Optymalizacja zapytań (c.d.) • Optymalizacja złączeń tabel: W przypadku użycia operatora <>, NOT, !=, !<, !>, NOT EXISTS , NOT IN czy NOT LIKE konieczne okazuje się sprawdzenie wartości wszystkich wierszy tabeli źródłowej. Chociaż nie oznacza to, że SQL Server nie potrafi skorzystać z indeksów przy tworzeniu planu zapytania zawierającego wyżej wymienione operatory, to należy dążyć do zastąpienia takich operatorów argumentami SARG. T. Pankowski/A. Stachowiak • Jeżeli zapytanie zawiera klauzulę WHERE, optymalizator może zadecydować o wybraniu wierszy spełniających podane kryteria, zanim wykona operację złączenia. W ten sposób wielokrotnie zmniejsza się liczba wierszy, które będą łączone • Metody złączeń: • Hash Match – złączenie mieszające • Nested Loop – złączenie pętli zagnieżdżonych • Merge Join – złączenie sortująco-scalające 63 T. Pankowski/A. Stachowiak 64 Optymalizacja zapytań (c.d.) Optymalizacja zapytań (c.d.) Hash Match • Tego typu połączenie przeprowadzane jest, jeżeli optymalizator nie może znaleźć użytecznych dla złączenia indeksów. • Dane zawarte w tabelach źródłowych dzielone są na grupy według wartości funkcji skrótu (funkcji hash-ującej) obliczonej dla kolejnych wierszy, tzn. dane, dla których wartość tej funkcji jest taka sama trafiają do tej samej grupy. Wystarczy więc, że SQL Server porówna dane z tych samych grup. T. Pankowski/A. Stachowiak select * from dzialy2 d, pracownicy2 p where p.id_dzialu = d.id_dzialu 65 Optymalizacja zapytań (c.d.) T. Pankowski/A. Stachowiak 66 Optymalizacja zapytań (c.d.) Nested Loop • Złączenie tego typu polega na porównaniu przez SQL Server każdego wiersza z wewnętrznej tabeli złączenia (decyzja o tym, która tabela zostanie uznana za wewnętrzną jest podejmowana przez usługę Query Optimizer na podstawie liczby wierszy, ich unikalności i ziarnistości) z kolejnymi wierszami zewnętrznej tabeli złączenia. • Stosowne jest kiedy w tabeli wewnętrznej na kolumnie połączeniowej założony jest indeks. • Jeżeli obie mają indeksy to mniejsza z tabel preferowana jest jako tabela zewnętrzna T. Pankowski/A. Stachowiak Hash Match 67 Nested Loop create index ix_id_dz on dzialy2(id_dzialu) select * from dzialy2 d, pracownicy2 p where p.id_dzialu = d.id_dzialu tabela wewnętrzna T. Pankowski/A. Stachowiak 68 Optymalizacja zapytań (c.d.) Optymalizacja zapytań (c.d.) Merge Join • Złączenie poprzez łączenie (merge) wybierane jest wtedy, gdy obie tabele są posortowane według kolumny złączenia (utworzony jest na nich indeks grupujący). Ponadto przynajmniej jedna z tych kolumn powinna zawierać wartości niepowtarzalne (indeks zdefiniowany jest jako unikalny) Nested Loop create index ix_id_dz on pracownicy2(id_dzialu) select * from dzialy2 d, pracownicy2 p where p.id_dzialu = d.id_dzialu tabela wewnętrzna T. Pankowski/A. Stachowiak 69 Kiedy tworzyć indeksy 70 Statystyki • tworzyć na kolumnach często używanych w klauzulach WHERE, ORDER BY, GROUP BY • tworzyć raczej na kolumnach typu liczbowego • nie tworzyć za dużo indeksów, usuwać nieużywane • tworzyć na kolumnach i dużej selektywności (tzn. np. nie na kolumnie ‘płeć’) i raczej nie tworzyć na kolumnach typu IDENTITY • tworzyć indeks grupujący na każdej tabeli • tworzyć indeksy na kolumnach połączeniowych T. Pankowski/A. Stachowiak T. Pankowski/A. Stachowiak 71 • Statystyki przechowują (w kolumnie statblob typu image tabeli sysindexes) określoną próbkę danych zapisanych w poindeksowanych kolumnach. Informacja ta służy procesowi optymalizatora do wyboru najlepszego planu wykonania zapytania. • SQL Server umożliwia również utworzenie statystyk dla kolumn niepowiązanych z żadnym indeksem. Jeżeli włączona jest opcja auto create statistics, SQL automatycznie utworzy statystyki dla kolumn, do których nastąpiło odwołanie w klauzuli WHERE. • Możliwe jest samodzielne utworzenie statystyki dla wybranych kolumn (polecenie CREATE STATISTICS ), ręczna aktualizacja wybranych statystyk (polecenie UPDATE STATISTICS), oraz usunięcie nieużywanych statystyk (DROP STATISTICS ) T. Pankowski/A. Stachowiak 72 Pytania kontrolne Pytania kontrolne (c.d.) 1. Indeksy: rodzaje indeksów, zastosowania, zalety i wady indeksów, kiedy tworzymy indeksy. 2. B- drzewa: budowa, operacje wstawiania i usuwania elementów, obliczenia (wysokość B-drzewa, ilość wierzchołków, itp.), (przykłady z wykładu). 3. Strona B-drzewa ma wielkość 1KB, pole klucza ma długość 16B, pole wskaźnika na blok ma długość 4B, pole wskaźnika na rekord ma długość 8B. Ile indeksów mieści się na trzecim poziomie tego drzewa przy minimalnym wypełnieniu. 3. Różnice między B-drzewem a B+-drzewem. 4. Cele i etapy optymalizacji zapytań, jakie elementy wpływają na koszt wykonania zapytania. ZADANIA: 1. Jaką wysokość musi mieć B-drzewo klasy t(h, 5), aby przy maksymalnym wypełnieniu zaindeksować plik liczący 14 500 rekordów? T. Pankowski/A. Stachowiak 2. Dany jest indeks zorganizowany jako B-drzewo klasy t(3,10). Jaka jest maksymalna liczba rekordów bazy danych, którą można zaindeksować przy użyciu tego B-drzewa? 73 Uwaga: trzeba rozpocząć od obliczenia współczynnika wypełnienia (m) B-drzewa. T. Pankowski/A. Stachowiak 74