background image

Indeksy 

background image

Wstęp

Indeksy są specjalnym mechanizmem bazy danych, który 

pozwala na przyspieszenie wyszukiwania danych. Jest to 

niewątpliwie bardzo ważny parametr charakteryzujący bazę 

danych. 
Szczególnie w bazach zawierających wiele tysięcy rekordów 

mechanizm indeksów jest niezbędny do zapewnienia 

rozsądnych czasów wyszukiwania danych

background image

Przegląd zagadnień

Dostęp fizyczny do danych
Optymalizacja dostępu
Indeksy i ich zastosowanie
Rodzaje indeksów
Operacje na indeksach
Podsumowanie
Laboratorium 

background image

Dostęp fizyczny do danych

Jak wiadomo, dane w bazach danych w sposób trwały są 

zapisywane na dyskach optycznych, magnetycznych lub 

rodzinach nośników o dostępie bezpośrednim takich jak 

macierze RAID. 
SZBD najczęściej nie zajmuje się fizyczną obsługą dysków. 

W procesie dostępu do danych biorą udział: menedżer 

plików i menedżer dysku.
Menedżer plików ma odpowiednią wiedzę o strukturze 

systemu plików i jest odpowiedzialny za odszukanie 

odpowiedniego pliku. 
Menedżer dysku ma natomiast niezbędną wiedzę na temat 

fizycznej organizacji dysku i jest odpowiedzialny za 

odnalezienie odpowiedniej strony danych.

background image

Dostęp fizyczny do danych 

Schemat łańcucha dostępu do danych 

background image

Optymalizacja dostępu 

Zasadniczy czas dostępu do danych bazy to czas odczytu 

tych danych z dysków. 
W celu optymalizacji tego dostępu stosuje się metodę zwaną 

klastrowaniem.
Klastrowanie polega na dążeniu do utrzymania blisko siebie 

na dysku rekordów, które są logicznie powiązane.
Taka organizacja danych znacznie przyspiesza dostęp do 

danych. 

Aby odczytać dane powiązane i w związku z tym zapewne 

razem wykorzystywane i odczytywane, głowica nie musi 

wykonywać dużych ruchów, a tym samym maleją czasy 

wyszukiwania.

background image

Optymalizacja dostępu 

Rozróżniamy przy tym dwa rodzaje klastrowania:

klastrowanie wewnątrzplikowe,
klastrowanie międzyplikowe.

Klastrowanie wewnątrzplikowe polega na grupowaniu 

rekordów obok siebie wewnątrz jednego pliku.
Klastrowanie międzyplikowe polega na umieszczaniu na 

stronie obok siebie rekordów pochodzących z więcej niż 

jednego pliku (tabeli).
Optymalizacja dostępu do danych sprowadza się w zasadzie 

do odpowiedniego zarządzania stronami i decydowania w 

jaki sposób dane mają być klastrowane.

background image

Optymalizacja dostępu 

Jak to pokazano na powyższym rysunku, wszystkie 

dane z tabeli relacyjnej bazy danych są 

przechowywane na stronach danych (ang. page) na 

dysku. 
W serwerze MS SQL strona danych ma wielkość 8 KB. 

Strony tworzą większe struktury zwane stertami (ang. 

heap).

background image

Optymalizacja dostępu 

Sterta jest kolekcją stron danych. W każdej tabeli dane są 

przechowywane w kolekcji 8 kilobajowych stron. 8 ciągłych 

stron tworzy zakres (ang. extent).
Wiersze danych nie są na stronach przechowywane w 

szczególnej kolejności, a strony danych nie są połączone w 

listę. Jeśli podczas wstawiania danych do strony, strona 

ulega przepełnieniu, to wtedy następuje podział takiej strony.
Ponieważ jeden wiersz tabeli musi zmieścić się na stronie 

danych, więc w serwerze MS SQL występuje ograniczenie 

co do wielkości wiersza i wynosi ono 8060 bajtów (ponieważ 

na stronie zapisywane są jeszcze metadane -informacje o 

obiekcie, którego dane przechowuje strona itd., dane nie 

zajmują dokładnie pełnych 8 KB).

background image

Optymalizacja dostępu 

background image

Indeksy i ich zastosowanie

Zastanowimy się teraz nad problemem wyszukiwania danych 

w tabeli. Załóżmy, że w tabeli Studenci chcemy znaleźć 

studenta o nazwisku Nowak.

ID

Nazwisko

Imie

Wydzial

1

Olacki

Jan

Elektryczny

2

Babicki

Adam

Mechaniczny

3

Nowak

Jerzy

Elektryczny

4

Adamski

Adam

Elektronika

Wiersze zapisane są w bazie w kolejności ich wpisywania i nie 

są w szczególny sposób sortowane. 
Co robi wobec tego system, kiedy wydajemy polecenie 

odnalezienia rekordu zawierającego informacje o Nowaku

SELECT imie, nazwisko FROM Studenci 
WHERE Nazwisko = 'Nowak'

background image

Indeksy i ich zastosowanie

System musi przeszukać całą tabelę (skanowanie 

wszystkich stron danych zawierających dane z tabeli) i 

przejrzeć wszystkie rekordy tej tabeli, aby mieć pewność, że 

odnalazł rekordy zawierające nazwiska Nowak. Operacja 

taka jest oczywiście czasochłonna.
Podobnie jest, gdy w książce poszukujemy jakiegoś hasła 

(na przykład w podręczniku do baz danych szukamy 

informacji o indeksach). 
Aby znaleźć szukaną informację, powinniśmy przeczytać 

całą książkę. 
Na szczęście niektóre książki są wyposażone na końcu 

w specjalne zestawienie haseł - czyli w indeks haseł.

background image

Indeksy i ich zastosowanie

Nasze postępowanie przebiega wówczas następująco:

1.

Odszukujemy poszukiwane hasło w indeksie, które jest 

uporządkowany alfabetycznie (co znacznie ułatwia 

nam odnalezienie hasła).

2.

Odczytujemy w indeksie numer strony na której hasło 

to występuje w książce.

2.

Otwieramy książkę na odpowiedniej stronie.

3.

Przeglądamy stronę w poszukiwaniu naszego hasła.

4.

Odczytujemy informacje związane z szukanym 

hasłem.

Idea działania indeksów w bazie danych jest dokładnie taka 

sama.

background image

Indeksy i ich zastosowanie

Indeks określony na atrybucie A relacji jest 

mechanizmem, który pozwala na efektywne 

wyszukiwanie krotek o ustalonej wartości składowej 

atrybutu A. 
Jak więc wyglądałby indeks dla tabeli Studenci?

Indeks określany jest dla konkretnego pola. Mówimy wówczas, że pole to 

jest polem indeksowanym. W wypadku tabeli Studenci możemy jako 

pole indeksowane wybrać pole nazwisko. Wówczas założenie indeksu na 

tym polu będzie oznaczało założenie przez system dodatkowej tabeli, w 

której umieszczone zostaną nazwiska studentów z tabeli Studenci oraz 

dostarczy przesłankę, gdzie należy szukać (na której stronie danych) 

pełnej informacji o danym studencie. Dodatkowo rekordy w tabeli indeksu 

zostaną posortowane w kolejności alfabetycznej nazwisk. Poszukiwanie 

studenta Nowaka będzie teraz przebiegać znacznie szybciej.

background image

Indeksy i ich zastosowanie 

Zalety

Wady

Przyspieszają 

dostęp do 

danych

Zajmują 

miejsce na 

dysku

Wymuszają 

unikatowość 

wierszy

Zwiększają 

obciążenie 

systemu

Działanie i rola indeksów polega głównie na przyspieszeniu 

wyszukiwania rekordów w bazie danych. 
Niestety obciążają one dodatkowo system w czasie aktualizacji lub 

wstawiania danych. SZBD musi bowiem oprócz umieszczenia rekordu w 

bazie dokonać też wpisu w tabeli indeksu oraz ponownie posortować 

rekordy tabeli indeksu.
Niektóre z pól warto jest indeksować, inne natomiast nie powinny 

być nigdy indeksowane.

background image

Indeksy i ich zastosowanie

Warto indeksować następujące pola:

klucze podstawowe i obce (często są automatycznie 

indeksowane),
pola, po których często następuje wyszukiwanie,
pola, do których dostęp następuje w ustalonej, 

uporządkowanej kolejności.

Nie należy indeksować:

pól, do których rzadko odwołują się zapytania,
pól, które zawierają tylko kilka wartości unikatowych,
pól zawierających dane typu image, bit czy obiekt OLE.

background image

Indeksy i ich zastosowanie 

Indeksy mogą być zakładane na jednym polu lub na większej liczbie pól 

jednocześnie. 
Dostęp do danych z wykorzystaniem indeksów nie zawsze jest najlepszym 

rozwiązaniem. Czasem lepiej jest nie korzystać z indeksów, ale bezpośrednio 

skanować tabelę. 
SZBD sprawdza, czy dla danej tabeli istnieją indeksy, a następnie optymalizator 

zapytań analizuje zapytanie i podejmuje decyzję, czy dostęp do danych będzie 

prowadzony poprzez skanowanie tabeli, czy przy wykorzystaniu indeksu.

background image

Rodzaje indeksów

Indeksy można klasyfikować w różny sposób. 
Zasadniczo dzielimy je na dwie grupy:

indeksy grupowane (klastrowe),
indeksy niegrupowane (nieklastrowe).

background image

Rodzaje indeksów –

Indeksy grupowane (ang. clustered)

Indeks grupowany działa na podobnej zasadzie jak książka 

telefoniczna. Zawiera strony szybkiego dostępu do danych 

(w książce telefonicznej na początku znajduje się 

alfabetyczny spis mówiący o tym, na której stronie szukać 

nazwisk, firm czy instytucji zaczynających się na daną literę 

alfabetu).
Strony te są ułożone w odwrócone drzewo i przechowują 

tylko ułożone alfabetycznie wartości indeksowanego pola 

oraz wskaźniki do stron znajdujących się w niższej warstwie 

drzewa. 
Na samym dole drzewa znajdują się strony zawierające 

posortowane wg indeksowanego pola dane (w książce 

telefonicznej zawartość też jest posortowana - wg nazwisk 

lub nazw firm czy instytucji).

background image

Rodzaje indeksów –

Indeksy grupowane (ang. clustered)

Przeszukiwanie indeksu odbywa się z góry na dół na 

następującej zasadzie: porównywana jest szukana wartość 

pola indeksowanego z wartościami zapisanymi (i 

posortowanymi) na stronach indeksu - jeśli znajdzie się 

wartość "większa" od wartości szukanej, wtedy następuje 

skok jeden poziom niżej do strony wskazywanej przez 

ostatnią pozycję (na ostatnio sprawdzej stronie), która nie 

była "większa" od szukanej wartości.
Każda pozycja na stronach zawiera wskaźnik do strony 

danych jeden poziom niżej w hierarchii indeksu. Dzięki takiej 

strukturze przeszukiwane są tylko wybrane strony z danymi, 

nie zaś wszystkie strony zawierające dane z wybranej tabeli.

background image

Rodzaje indeksów –

Indeksy grupowane (ang. clustered)

W indeksie grupowanym strony z danymi wchodzą w 

skład indeksu i są posortowane po tym polu tabeli, które 

jest indeksowane. Wynika z tego, że na indeks grupowany 

należy przeznaczyć więcej miejsca na dysku niż na same 

dane (posortowane dane + strony indeksu z najwyższych 

warstw). 
W związku z przedstawioną powyżej zasadą działania 

indeksów nie wszystkie zapytania wykorzystują indeksy. 

Np. zapytanie (w MS SQL Server)
SELECT imie, nazwisko FROM osoby 

WHERE nazwisko LIKE '%mar%‘
nie wykorzysta indeksu na polu nazwisko, ponieważ 

niemożliwe będzie porównanie wartości wzorca z 

wartościami na stronach indeksu.

background image

Rodzaje indeksów 

Indeksy grupowane

Indeks grupowany może być dla danej tabeli tylko jeden 
(jednoznaczne sortowanie danych w indeksie). 
W MS SQL Server na wszystkich polach będących kluczami 
głównymi tabel są domyślnie zakładane indeksy 
grupowane. 

background image

Rodzaje indeksów –

Indeksy niegrupowane (ang. nonclustered)

Indeks niegrupowany działa na podobnej zasadzie jak indeks 

typowej w książce (ale nie w telefonicznej). 
Indeks niegrupowany budowany jest na stronach danych, 

które nie są sortowane. 
Składa się z co najmniej dwu poziomów: poziomu 

niepomocniczego i poziomów pomocniczych. Na stronach 

poziomu niepomocniczego podobnie jak w przypadku 

indeksu grupowanego przechowywane są wartości 

indeksowanego pola ze wskaźnikami do poziomu niżej w 

drzewie indeksu.
Strony poziomu pomocniczego zwane też liśćmi (ang. leaf) 

zawierają wskaźniki do konkretnych stron danych (które nie 

są posortowane). Wskaźnik taki zawiera następujące dane: 

ID pliku, numer strony, numer wiersza na stronie.

background image

Rodzaje indeksów –

Indeksy niegrupowane (ang. nonclustered)

Przeszukiwanie indeksu niegrupowanego odbywa się na 

podobnej zasadzie, jak w indeksie grupowanym. 
Po dojściu do poziomu pomocniczego następują skoki do 

stron danych (do konkretnych wierszy).

background image

Rodzaje indeksów –

Indeksy niegrupowane (ang. nonclustered)

Maksymalna ilość indeksów niegrupowanych w pojedynczej 

tabeli zależy od SZBD. 
W MS SQL Server 2000 w jednej tabeli można utworzyć 

maksymalnie 249 takich indeksów.

Indeksy mają kluczowe znaczenie dla optymalizacji 

wydajności baz danych. Dobrze zaprojektowane indeksy 

mogą znacząco poprawić szybkość operacji przeszukiwania 

bazy danych (najczęściej wykonywana operacja i dotyczy 

największych ilości danych), ale źle zaplanowane mogą 

spowodować efekt odwrotny do pożądanego. Dlatego należy 

starannie zaplanować ich strukturę. 

background image

Operacje na indeksach 

Indeksy są tworzone najczęściej automatycznie dla kluczy 

głównych oraz dla pól, dla którym ma być wymuszona 

unikatowość.
Indeksy można też tworzyć dla innych pól korzystając z 

polecenia języka SQL CREATE INDEX.
Poniżej podano przykład utworzenia indeksu 

grupowanego dla tabeli memeber dla pola lastname.

background image

Operacje na indeksach 

Indeksy mogą wymuszać unikatowość pól lub nie. 

Przykład deklaracja indeksu wymuszającego unikatowość 

pola title_no podano poniżej. 
Po założeniu takiego indeksu dodanie do tabeli rekordu o 

istniejącej już wartości pola title_no nie będzie możliwe.

background image

Operacje na indeksach 

Indeks może też być zakładany na kilku polach jednocześnie. Poniższy 

przykład pokazuje sposób definiowania unikalnego indeksu na polach isbn i 

copy_no jednocześnie.
Założenie takiego indeksu spowoduje, że będzie można wprowadzić do tabeli 

rekord o istniejącej już wartości pola isbn oraz rekord o istniejącej wartości 

pola copy_no. Nie będzie natomiast możliwe wprowadzenie rekordu, w którym 

para wartości isbn i copy_no będzie się powtarzać.

background image

Podsumowanie

Indeksy stanowią ważny mechanizm przyspieszający dostęp 

do danych zapisanych w bazie i wymuszający unikatowość 

danych. 
Z drugiej jednak strony obciążają dodatkowo system w 

czasie wykonywania operacji aktualizacji i wstawiania 

danych. 
Dlatego też indeksy należy stosować z rozwagą starannie 

planując, gdzie jakiego rodzaju indeksy założyć.
Decyzje o zakładaniu indeksów wynikają często ze specyfiki 

użytkowania bazy (np. kryteriów wyszukiwania) i często są 

podejmowane w czasie pierwszego okresu użytkowania 

bazy - okresu dostrajania systemu.

background image

Podsumowanie

Dostęp fizyczny do danych
Optymalizacja dostępu
Indeksy i ich zastosowanie
Rodzaje indeksów
Operacje na indeksach

background image

Laboratorium

Przygotowanie tabeli 

Wykonanie zapytania bez optymalizacji 

Stworzenie indeksu 

Wykonanie zapytania z optymalizacją