(Microsoft PowerPoint - BD_W11_D_student [tryb zgodno\234ci])
Transkrypt
(Microsoft PowerPoint - BD_W11_D_student [tryb zgodno\234ci])
Plan wykładu • Pojęcie indeksu - rodzaje indeksów Bazy danych • Metody implementacji indeksów – struktury statyczne Wykład 11: Indeksy. Język DDL i DML. – struktury dynamiczne Małgorzata Krętowska Wydział Informatyki PB 2 Metody organizacji pliku rekordów przypomnienie wiadomości Pojęcie indeksu – Plik nieuporządkowany • Indeks to struktura danych na dysku umożliwiająca szybkie wyszukiwanie danych w bazie danych na podstawie wartości klucza wyszukiwania jak np. nazwisko osoby. – Plik posortowany • Indeks = skorowidz w książce. – Plik haszowany • W najprostszej postaci wyszukiwanie polega na tym, że mając wartość poszukujemy rekordów, w których ta wartość występuje w danym polu. 3 4 Klucz wyszukiwania Plik indeksowy • Klucz wyszukiwania (wartość indeksowana) dla indeksu jest to wybrane pole lub pola rekordu, względem których ma odbywać się wyszukiwanie. Indeks jest to struktura danych składająca się z węzłów, w których są zapisywane rekordy indeksu w następującej postaci: – pozycje danych k* określane względem wartości klucza wyszukiwania k tzn • sam rekord o kluczu k • para (k,w) gdzie k jest kluczem rekordu, a w jest wskaźnikiem do rekordu o tym kluczu • para (k,w1,.., wn), gdzie k jest kluczem rekordu, a w1,.., wn są wskaźnikami do rekordów o kluczu k (wymaga zmiennej liczby pól) – pozycje indeksu kierujące wyznaczeniem właściwej pozycji danych k* w oparciu o wartość klucza wyszukiwania k (np. para (wartość klucza, wskaźnik do węzła w indeksie) • Zawartość indeksu jest przechowywana w pliku indeksowym • W skład pliku indeksowego wchodzą rekordy indeksu będące pozycjami danych lub pozycjami indeksu. • Węzeł odpowiada na ogół stronie dyskowej i zawiera albo pozycje danych albo pozycje indeksu. 5 Rodzaje indeksów 6 Indeks główny (podstawowy) • Indeks główny lub podstawowy (primary index) – założony na atrybucie porządkującym unikalnym • Indeks zgrupowany (clustering index) – założony na atrybucie porządkującym nieunikalnym • Indeks wtórny (secondary index) – założony na atrybucie nieporządkującym Podział ze względu na liczbę wskazań do pliku danych: • Indeks gęsty (dense) – posiada rekord indeksu dla każdego rekordu indeksowanego pliku danych • Indeks rzadki (sparse) – posiada rekordy tylko dla wybranych rekordów indeksowanego pliku danych 7 8 Indeks zgrupowany z blokami nadmiarowymi Indeks zgrupowany 9 10 Indeks wtórny Złożone klucze wyszukiwania • • Pojedyncze klucze wyszukiwania - wyszukiwanie według pojedynczego pola Złożone klucze wyszukiwania - wyszukiwanie według kombinacji większej liczby pól 29,5000 29 34,1500 34 34,2000 43,3000 <wiek, zarobki> 1500,34 2000,34 3000,43 5000,29 <zarobki, wiek> 11 Adamski Bakun 34 29 1500 5000 Molski 34 2000 Wilczak 43 3000 Rekordy danych posortowane względem imienia 34 43 <wiek> 1500 2000 3000 5000 <zarobki> 12 Statyczne drzewo ISAM Metody implementacji indeksów (indexed sequential access method) • • Indeksy statyczne • • Indeksy dynamiczne • Wyszukiwanie binarne - (pliki posortowane) porównujemy poszukiwany klucz z kluczem rekordu znajdującym się w środku ciągu i w zależności od wyniku porównania poszukujemy klucza albo w lewej części albo w prawej, stosując rekurencyjnie opisywaną metodę Poszukiwanie binarne łatwiej zastosować jest nie bezpośrednio do pliku rekordów, ale do pliku zawierającego same klucze rekordów k1<k2<...<kN, gdzie ki jest najmniejszym kluczem na stronie o numerze i. Plik z kluczami stanowi plik indeksowy Po wyznaczeniu najbliższego pasującego klucza wystarczy przejść do strony z rekordami , na której znajduje się rekord o danym kluczu. Jednopoziomowy plik indeksowy k1 k2 Strona 1 kN Strona 2 Strona 3 strona N Plik indeksowy Plik danych 13 Statyczne drzewo ISAM Indeks wielopoziomowy (drzewo ISAM) • Strona indeksu jednopoziomowego (węzeł) składa się z pozycji indeksu <ki, Pi>, gdzie ki jest kluczem, a Pi jest wskaźnikiem na stronę zawierającą wartości klucza >= od klucza ki . Wskaźnik P0 stanowi wskaźnik na stronę o wartościach klucza <k1. • Strona indeksu wielopoziomowego (węzeł) składa się z pozycji indeksu <ki, Pi>, gdzie ki jest kluczem, a Pi jest wskaźnikiem do węzła wyższego poziomu zawierającego wartości kluczy >= od klucza ki . Wskaźnik P0 stanowi wskaźnik do węzła wyższego poziomu zawierającego wartości klucza <k1. Pozycja indeksu p0 k1 p1 k2 p2 ..... km pm 14 Strona indeksu k1<k2<...<km Pozycja indeksu p0 k1 p1 k2 p2 ..... km pm Zasady poszukiwania danego klucza 21 34 56 Do strony z wartościami klucza <21 Do strony z 21<=k <34 Do strony z 34<=k <56 Strona indeksu k1<k2<...<km Wskaźniki na węzły wyższego poziomu Do strony z k >=56 15 16 Struktura drzewa ISAM Problemy • Dodawanie i usuwanie rekordów Węzły wewnętrzne – w przypadku indeksu głównego jest to problem złożony, gdyż musimy wstawić rekord na odpowiedniej pozycji w pliku. Wiąże się to z przeniesieniem części rekordów w pliku, a co za tym idzie zmiany wpisu w indeksie, gdyż przesunięcie rekordów powoduje zmiany wartości kluczy w danym bloku. • Próby rozwiązania problemu: liście Strony nadmiarowe – Wykorzystanie nieuporządkowanego pliku przepełnienia – Użycie listy jednokierunkowej rekordów przepełnienia dla każdego bloku w pliku danych (przykład indeksu - kolejny slajd) Strony główne 17 Podsumowanie drzew ISAM 18 Dynamiczne indeksy wielopoziomowe • Drzewa ISAM dobrze sprawdzają się do wyszukiwania rekordu na podstawie wartości jego klucza, a także rekordów z zakresu wartości klucza: A<=klucz<=B; A<=klucz, klucz<=B • B-drzewa • Gdy liczba rekordów w pliku jest mniej więcej stała struktura ISAM jest dobra • B+- drzewa • Niebezpieczeństwo grupowania się kluczy w ciągi na stronach nadmiarowych (rozwiązanie struktury dynamiczne) 19 20 B-drzewo B-drzewo • B-drzewo rzędu p: – każdy wierzchołek wewnętrzny na postać: – <P1, <K1, Pr1>, P2, <K2, Pr2>,...,<Kq-1, Pq-1>, Pq> gdzie q<=p. Każde Pi oznacza wskaźnik drzewa - wskaźnik na inny wierzchołek w B-drzewie. Każde Pri oznacza wskaźnik danych wskaźnik na rekord, którego wartość pola klucza wyszukiwania jest równa Ki (lub blok w pliku zawierający ten rekord) – w każdym wierzchołku K1<K2<...<Kq-1 – dla wszystkich wartości pola wyszukiwania X w poddrzewie, na które wskazuje wskaźnik Pi mamy Ki-1<X<Ki, dla 1<i<q oraz Ki-1<X dla i=q – Każdy wierzchołek prócz korzeni i liści posiada co najmniej ceil(p/2) wskaźników drzewa – Wszystkie liście znajdująsię na tym samym poziomie. Liście posiadają taką samą strukturę co wierzchołki wewnętrzne poza tym, że ich wskaźniki drzewa są zerowe P1 K1 Pr1 P2 Wskaźnik danych X<K1 Ki-1 Pri-1 Pi Wskaźnik danych Ki Pri Wskaźnik danych Ki-1<X<Ki Kq-1 Prq-1 Pq Wskaźnik danych Kq-1<X • Z powodu niejednolitosci węzłów dla B drzew operacje INSERT i DELETE są bardziej skomplikowane => B+- drzewa. 21 B+ - drzewo 22 Wierzchołki wewnętrzne • Wykorzystywane przez większość implementacji dynamicznych indeksów • Wyróżniamy wierzchołki wewnętrzne i liście (różne struktury danych) • Wymagana zajętość strony indeksu wynosi minimum 50% ( z wyjątkiem korzenia) • Zajętość każdej strony liścia wynosi minimum 50%. • Wierzchołki liści są zwykle połączone razem, co zapewnia możliwość uzyskiwania uporządkowanego dostępu do rekordów względem pola wyszukiwania • Struktura wierzchołków wewnętrznych B+ - drzewa rzędu p: – Każdy wierzchołek wewnętrzny ma postać <P1, K1, P2,K2,..., Pq-1, Kq-1, Pq> gdzie q<=p i każde pi jest wskaźnikiem drzewa – W każdym wierzchołku wewnętrznym K1<K2<...<Kq-1. – Dla wszystkich wartości pola wyszukiwania X w podrzewie, na które wskazuje wskaźnik pi mamy: Ki-1<X<=Ki, dla 1<i<q oraz Ki-1<X dla i=q – Każdy wierzchołek wewnętrzny posiada najwyżej p wskaźników drzewa – Każdy wierzchołek wewnętrzny oprócz korzenia i liści posiada co najmniej ceil(p/2) wskaźników drzewa. Korzeń posiada co najmniej 2 wskaźniki drzewa. – Wierzchołek wewnętrzny o q wskaźnikach drzewa, gdzie q<=p posiada q-1 wartości pola wyszukiwania • B+- drzewo jest wyważone tzn. każdy liść znajduje się na tej samej głębokości 23 24 Wierzchołki wewnętrzne Wierzchołki liści • Struktura wierzchołków liści B+- drzewa rzędu p: P1 Pi-1 K1 Ki Kq-1 – Każdy wierzchołek liścia ma postać: Pq – <<K1, Pr1>,<K2,Pr2>, ..., <Kq-1, Prq-1>, Pnast> – gdzie q<=p i każde Pri jest wskaźnikiem danych, zaś Pnast wskazuje na następny wierzchołek liścia w B+-drzewie. – W każdym wierzchołku liścia K1<K2<.., Kq-1, dla q<=p – Każde Pri jest wskaźnikiem danych wskazujących na rekord, którego wartość pola wyszukiwania jest równa ki lub na blok pliku zawierający dany rekord (lub na blok rekordu wskaźników wskazujących na rekordy, których wartością pola wyszukiwania jest Ki, jeżeli pole wyszukiwania nie jest kluczem) – Każdy wierzchołek liścia posiada co najmniej ceil(p/2) wskaźników drzewa – Wszystkie wierzchołki znajdują się na tym samym poziomie Wskaźniki drzewa X<=K1 Kq-1<X Ki-1<X<=Ki 25 26 Wierzchołki liści Podsumowanie drzew • Zastosowania indeksów o strukturze drzewiastej K1 Pr1 K2 Pr2 Ki Pri Kq-1 Prq-1 – – – – Pnast wyszukiwanie zakresowe wyszukiwanie równowartościowe sortowanie (order by) wyszukiwanie przy uzgadnianiu wierszy w trakcie złączania tabel • Drzewo ISAM - struktura statyczna Wskaźnik danych – struktura prostsza niż B+-drzewa – modyfikowane są tylko liście – wymagane są strony nadmiarowe, mogące pogorszyc czas wykonywania wyszukiwania Wskaźnik danych Wskaźnik na następny wierzchołek liścia w drzewie 27 • B+-drzewo - struktura dynamiczna – w praktyce wysokość<=3 – zakładając, że korzeń drzewa jest zawsze trzymany w buforze RAM, koszt wyszukania pozycji dancyh rekordu wynosi co najwyżej 3 operacje we/wy 28 Tworzenie tabel Typy kolumn • char(rozmiar) - ciąg znaków stałej długości. Rozmiar (liczba znaków) określany w nawiasach o długości nie większej niż 255 bajtów. • varchar2(rozmiar) - ciąg znaków zmiennej długości. Rozmiar (liczba znaków, max 2000, domyślnie 1) określany jest w nawiasach. • CREATE TABLE nazwa_tabeli • (kolumna1 typ_danych(rozmiar) [DEFAULT wartość_domyślna] • [NULL|NOT NULL] [CONSTRAINT nazwa_ogr] ograniczenie_atr], • kolumna2 typ_danych(rozmiar) [DEFAULT wartość_domyślna] • [NULL|NOT NULL] [CONSTRAINT nazwa_ogr] ograniczenie_atr ...); • number(rozmiar) - typ numeryczny. Rozmiar określa liczbę cyfr w kolumnie. • number(rozmiar,d) - typ numeryczny. Rozmiar określa liczbę znaków w kolumnie, "d" określa maksymalną liczbę cyfr na prawo od kropki dziesiętnej. Skala "d" nie może być większa od precyzji "rozmiar" • Przykład: CREATE TABLE Departament (nr_departamentu number(2), nazwa varchar2(12), lokalizacja varchar(12)); CREATE TABLE Departament (nr_departamentu number(2) not null, nazwa varchar2(12), lokalizacja varchar(12)); • date – do reprezentacji dat i czasu • long – rozszerzenie typu varchar2, które pozwala przechowywać napisy do 2GB 29 30 Klauzula CONSTRAINT Klauzula CONSTRAINT • [CONSTRAINT nazwa_ogr] typ_ograniczenia • Służy do definiowania innych niż NOT NULL warunków integralności • Nazwa_ograniczenia - identyfikator warunku integralności, występujący np. w komunikatach o błędach spowodowanych przez niedozwoloną operację naruszającą to ograniczenia CREATE TABLE nazwa_tabeli (kolumna1 typ_danych(rozmiar) [DEFAULT wartość_domyślna] [NULL|NOT NULL] [CONSTRAINT nazwa_ogr] ograniczenie_atr]...); • Typ_ograniczenia: CHECK, PRIMARY KEY, UNIQUE, FOREIGN KEY CREATE TABLE nazwa_tabeli (kolumna1 typ_danych(rozmiar) [DEFAULT wartość_domyślna] [NULL|NOT NULL] .... CONSTRAINT nazwa_ogr typ_ograniczenia CONSTRAINT nazwa_ogr typ_ograniczenia ...); 31 • Ograniczenie - dodatkowe informacje, jego postać zależy od typu ograniczenia 32 Typy ograniczeń Przykład • Ograniczenie CHECK - określa warunek, jaki musi spełniać wartość w kolumnie każdego wiersza tabeli. Jeśli więzy są definiowane po definicji wszystkich kolumn, warunek może dotyczyć kilku kolumn, jeśli na poziomie kolumny - tylko tej kolumny. • W tabeli pracownik żądamy, aby nazwiska były wpisywane wielkimi literami • CONSTARAINT CHECK (warunek logiczny) • Prowizja osób innych niż sprzedawca musi być NULL. • • Warunek logiczny musi być prosty - niedopuszczalne są podzapytania, ani funkcje, których wartość zależy od okoliczności wywołania np. SYSDATE. Można używać OR i AND. 33 CREATE TABLE pracownik (.... Definicje wszystkich kolumn, CONSTRAINT stanowisko_prowizja_spr (prowizja IS NULL OR stanowisko=‘SPRZEDAWCA’) ); 34 PRIMARY KEY Przykład • Definiuje klucz główny tabeli (wymusza automatycznie warunek NOT NULL). Jeżeli klucz główny stanowi pojedyncza kolumna wygodnie jest zapisać ten warunek w składni przy kolumnie: • W tabeli pracownik kluczem jest numer pracownika: id_pracownika CREATE TABLE pracownik (id_pracownika NUMBER(4) CONSTARINT pracownik_pk PRIMARY KEY, ....); lub CREATE TABLE pracownik (id_pracownika NUMBER(4) PRIMARY KEY, ....); ... Kolumna typ CONSTRAINT nazwa_ogr PRIMARY KEY, .... • Jeżeli klucz składa się z dwóch lub więcej kolumn, wtedy należy określić go w składni po kolumnach: • Ustalić klucz w tabeli zlecenie. ..... CONSTARINT nazwa_ogr PRIMARY KEY (kol1,kol2,...) ...... 35 CREATE TABLE pracownik (.... nazwisko varchar2(10) CONSTRAINT wielkie_litery CHECK (nazwisko=UPPER(nazwisko)) ...); CREATE TABLE zlecenie (.... definicje kolumn CONSTRAINT zlecenie_pk PRIMARY KEY(nr_projektu, id_pracownika)); 36 UNIQUE Przykład • Definiuje klucz unikalny tabeli. Klucz unikalny pełni podobną rolę co klucz główny, z tym, że nie wymusza automatycznie warunku NOT NULL na należących do niego kolumnach • W tabeli departament nazwy departamentów nie są kluczem głównym ale też nie powinny się powtarzać. • • Klucz unikalny składający się z jednej kolumny: ... Kolumna typ CONSTRAINT nazwa_ogr UNIQUE, .... CREATE TABLE departament (.... nazwa NUMBER(4) NOT NULL CONSTRAINT d_nazwa_u UNIQUE, ....); • Klucz dla dwóch lub większej liczby kolumn: ..... CONSTARINT nazwa_ogr UNIQUE (kol1,kol2,...) ...... 37 38 FOREIGN KEY FOREIGN KEY • Aby możliwe było zdefiniowanie klucza obcego: • Definiuje klucz obcy, reprezentujący związek z inną tabelą. Powoduje, że wartości wskazanych kolumn mogą przyjmować jedynie wartości klucza głównego (lub unikalnego) pewnej (najczęściej innej) tabeli. • Jeżeli klucz obcy stanowi jedna kolumna: – tabela do której odnosi się klucz musi być utworzona – na wskazanym zestawie kolumn musi być utworzony klucz główny lub klucz unikalny – jeśli w tabeli obcej odwołujemy się do kolumn z klucza głównego, listę kolumn z tabeli obcej można pominąć ... Kolumna typ CONSTRAINT nazwa_ogr REFERENCES nazwa tabeli (kolumna1), .... • Własności kluczy obcych – w tabeli z kluczem obcym nie można wstawić wiersza, którego wartość w kolumnie z klucza obcego nie ma odpowiedników w tabeli obcej, – w tabeli z kluczem obcym nie można zmodyfikować wiersza, tak aby jego wartość kolumnie z klucza obcego nie miała odpowiedników w tabeli obcej, – z tabeli obcej nie można usunąć wiersza, do którego odnoszą się jakiekolwiek wiersze z tabeli z kluczem obcym - wstawienie dyrektywy ON DELETE CASCADE spowoduje, że przy usuwaniu wiersza z tabeli będą usuwane wszystkie odwołujące się do niego wiersze z tabel z kluczem obcym. • Jeżeli klucz obcy zbudowany jest z większej liczby kolumn ..... CONSTARINT nazwa_ogr FOREIGN KEY (lista_kolumn1) REFERENCES nazwa_tabeli (lista_kolumn2) ...... 39 40 Przykład Klauzula DEFAULT • Utworzyć klucze obce w tabeli pracownik. Jakie to będą klucze? • Służy do wskazania jaka wartość ma być wstawiona w polu kolumny jeśli w poleceniu wstawiania nie określono wartości tej kolumny. CREATE TABLE pracownik( nr_pracownika number (4) PRIMARY KEY, nazwisko varchar2(10), stanowisko varchar2(9), kierownik number(4) CONSTARAINT pracownik_fk_pr REFERENCES pracownik (nr_pracownika), data_zatrudnienia date, pensja number(7,2), prowizja number (7,2), nr_departamentu number(2) NOT NULL CONSTRAINT pracownik_fk REFERENCES departament ON DELETE CASCADE ); 41 • ... Kolumna typ DEFAULT wyrażenie, .... • Podane wyrażenie musi być zgodne z typem kolumny. • Wyrażenie musi być proste, nie mogą występować podzapytania • Dozwolone są funkcje typu SYSDATE. 42 Tworzenie tabeli przez zapytanie Przykład • Utworzyć tabelę zawierającą nazwisko, pensję i grupę zaszeregowania każdego pracownika. • CREATE TABLE nazwa_tabeli [nazwa_kolumny [NULL/NOT_NULL],....] AS SELECT zapytanie • CREATE TABLE pracownik_pensja (nazwisko, pensja, stopien) AS SELECT nazwisko, zarobki, nr_przedziału FROM pracownik, poziom_zarobkow WHERE pensja between dolna_granica and gorna_granica; • nowa tabela składa się z kolumn oraz wierszy określonych poleceniem SELECT • jeśli pozycje występujące na liście SELECT mają prawidłowe nazwy (nie są to wyrażenia) lub mają aliasy, lista nazw kolumn nowej tabeli może zostać pominięta • jeśli podana jest lista nazw nowej tabeli , liczba pozycji musi się pokrywać z liczbą pozycji, występujących po poleceniu SELECT 43 44 Zmiana definicji tabeli Dodawanie kolumn Zmiana definicji tabeli Zarządzanie więzami integralności • Zmiana definicji tabeli: ALTER TABLE • Dodawanie więzów integralności: • ALTER TABLE nazwa_tabeli ADD (CONSTRAINT nazwa_ogr [warunek]) ...); Dodawanie kolumn: ALTER TABLE nazwa_tabeli ADD (kolumna typ [(rozmiar)], kolumna typ [(rozmiar)], ...); • Włączanie i wyłączanie sprawdzanie więzów integralności: • ALTER TABLE nazwa_tabeli ENABLE CONSTRAINT nazwa_ogr; • ALTER TABLE nazwa_tabeli DISABLE CONSTRAINT nazwa_ogr; • Usuwanie warunku integralności: • ALTER TABLE nazwa_tabeli DROP CONSTRAINT nazwa_ogr; 45 46 Modyfikacja definicji kolumny Usuwanie tabel • ALTER TABLE nazwa_tabeli MODIFY (kolumna typ [(rozmiar)] [NULL |NOT NULL]); • DROP TABLE nazwa_tabeli; • usunięcie tabeli powoduje utratę wszystkich danych zawartych w tabeli oraz wszystkich indeksów • tabela może zostać usunięta przez jej właściciela albo administratora bazy danych • jeżeli istnieją tabele z kluczami obcymi odwołującymi się do usuwanej tabeli, usuwanie się nie powiedzie, chyba , że na końcu dodamy dyrektywę CASCADE CONSTRAINS. Wtedy zostaną usunięte odpowiednie definicje kluczy obcych w innych tabelach. • Nie można wykonać następujących modyfikacji: – kolumny, w której występują wartości NULL nie można przedefiniować z NULL na NOT NULL – nie można dodać nowej kolumny o własności NOT NULL (chyba, że tabela jest pusta). Dopiero po wpisaniu wartości kolumny można ją zmodyfikować. – Nie jest możliwe zmniejszenie rozmiaru kolumny lub zmiany jej typu, chyba, że kolumna jest pusta – nie jest możliwa zmiana typu kolumny 47 48 Zmiana nazwy tabeli • RENAME stara_nazwa TO nowa_nazwa 49