(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