Indeks zapewnia szybki dostęp do danych podczas przeszukiwania

Transkrypt

Indeks zapewnia szybki dostęp do danych podczas przeszukiwania
Sposób przechowywania danych na dysku twardym komputera ma zasadnicze
znaczenie dla wydajności całej bazy i jest powodem tworzenia między innymi indeksów.
Fizyczna struktura bazy danych w SQL Serwerze
•
Dane zapisane są w 8-kilobajtowych ciągłych obszarach zwanymi stronami.
Pojedynczy wiersz tabeli nie może być zapisany na kilku stronach, ale małe
wiersze mogą dzielić stronę.
•
Strony są łączone w 64- kilobajtowe zakresy. Małe tabele mogą dzielić ten sam
zakres.
•
Dane zapisywane na stronach nie są w żaden sposób uporządkowane, chyba że
został utworzony indeks grupujący.
•
Próba dodania danych do pełnej strony powoduje podzielenie już zapisanych w
niej danych pomiędzy dwie strony.
Jeżeli nie istnieją indeksy to wyszukanie pojedynczego wiersza tabeli wiąże się z
koniecznością odczytania wszystkich stron, na których została zapisana tabela. Pełne
przeszukanie tabeli rozpoczyna się od odczytania pierwszej strony tabeli, następnie
odczytywane są wszystkie pozostałe strony i następuję wybór wierszy spełniających
podane kryterium. Oznacza to, że w przypadku braku indeksu może być potrzeba
odczytania megabajtów danych tylko po to aby znaleźć pojedyncza informacje np.
numer czyjegoś telefonu. W przypadku gdy istnieją powiązane z tabelą indeksy,
znalezienie potrzebnych danych wymaga tylko znalezienia w indeksie ( jest on z
reguły obiektem dużo mniejszym niż tabela) wierszy tabeli spełniających podane
kryterium i odczytania wyłącznie tych stron, na których zostały zapisane znalezione
wiersze.
Indeks zapewnia szybki dostęp do danych podczas przeszukiwania. Dzięki indeksom
można szybko odnaleźć wiersze: a) spełniające warunki klauzuli WHERE, b) pasujące
klauzuli JOIN. Pozwalają na zachowanie różnowartościowości kolumn kluczy podczas
operacji INSERT i UPDATE. Wspomagają również
SQL serwer przy sortowaniu,
agregowaniu i grupowaniu danych jak również przy wyszukiwaniu wierszy wskazanych
klauzulą TOP.
O wyborze indeksu decyduje optymalizator kwarend określając, które (ewentualnie)
indeksy będą najbardziej użyteczne.
1
Rodzaje indeksów
SQL Server obsługuje dwa rodzaje indeksów: zgrupowane - grupujące (klastrowe)
(clustered) i niezgrupowane (nieklastrowe) (nonclustered). W indeksie zgrupowanym dane
są przechowywane we właściwej kolejności jak np. w encyklopedii. Indeks niezgrupowany
jest oddzielnym obiektem bazy danych, wskazującym poszczególne wiersze w tabeli, ale bez
uwzględnienia sposobu zapisania wiersz. Odpowiednikiem tego typu indeksu jest indeks
znajdujący się na końcu niektórych ksiąze. Zarówno indeksy zgrupowane jak i
niezgrupowane przechowują informacje przy użyciu standardowych B-drzew. B-dzrewo
zapewnia szybki dostęp do danych gdyż grupują rekordy o podobnych kluczach. B- drzewo
oznacza drzewo zbalansowane i właśnie balansowanie drzewa jest kluczową właściwością Bdrzewa. Stan drzewa jest przez cały czas kontrolowany, a gałęzie są w razie potrzeby
modyfikowane tak, aby do przejścia przez drzewo w celu odnalezienia jakiejś wartości i
dotarcie do konkretnego rekordu wymagało tylko kilku dostępów do strony.
Indeksy zgrupowane
Większość tabel powinna mieć indeks zgrupowany, a jeśli tabela ma tylko jeden
indeks to powinien być to indeks zgrupowany. Kolejność zapisów danych zgodna z
wartościami klucza indeksu zgrupowanego oznacza, że zachowany jest odpowiedni porządek
stron w łańcuchu. Jeśli SQL Server przemierza łańcuch stron, będzie odwiedzał każdy wiersz
w kolejności indeksu zgrupowanego, a nowe strony mogą być swobodnie dodawane. W
programie SQL Server wszystkie indeksy zgrupowane są różnowartościowe, nawet, jeśli
zbudujemy
indeks
bez
użycia
klauzuli
UNIQUE.
Wtedy
SQL
Server
wymusi
różnowartościowość przez dodanie do wierszy (jeżeli zajdzie taka potrzeba) identyfikator
ujednoznaczający (uniquefer). Jest to 4 – bajtowa wartość dodawana jako kolejny klucz
sortowania do tych wierszy, które mają powtarzające się wartości podstawowego klucza
sortowania.
Indeksy niezgrupowane
W przypadku indeksu niezgrupowanego najniższy poziom drzewa (poziom liści)
zawiera zakładkę informującą, SQL Sever, gdzie ma znaleźć wiersz danych odpowiadający
kluczowi
indeksu.
Dal
jednej
tabeli
można
ich
maksymalnie
utworzyć
249.
2
Tworzenie indeksu
CREATE [UNIQUE] [CLUSTERED] [NONCLUSTERED] INDEX nazwa_indeksu
ON {tabela/widok} (kolumna [Asc/Desc] [,...n])
[WITH <opcja_indeksu> [...n]]
<opcja indeksu>::=
{PAD_INDEX|
FILLFACTOR = współczynnik_wypełnienia
IGNORE_DUP_KEY|
DROP_EXISTING|
STATISTICS_NORECOMPUTE|
SORT_IN_TEMPDB
}
CREATE INDEX tel_prac_idx ON pracownicy (telefon)
wykonanie tego polecenia spowoduje utworzenie indeksu niezgripowanego o nazwie
tel_prac_idx na atrybucie telefon w relacji pracownicy.
3
Argumenty polecenia CREATE INDEX
Argument
UNIQUE
CLUSTREAD
NONCLUSTREAD
Wyjaśnienie
nie dopuszcza się występowania dwóch takich samych wierszy, jeśli wśród
danych mimo wszystko zajdzie taka sytuacja, to indeks nie zostanie utworzony
określenie sposobu tworzenia indeksu. Można utworzyć tylko jeden indeks
|
klastrowy i 249 indeksów nieklastrowych. Domyślnie tworzy się indeksy
nieklastrowe.
nazwa_indeksu
określa nazwę tworzonego indeksu
tabela | widok
nazwa tabeli lub perspektywy (widoku) na podstawie której ma zostać
utworzony indeks
kolumna
nazwa kolumny lub kolumn (gdy ma być to indeks złożony)
ASC |DESC
określenie sposobu sortowania indeksu (rosnąco ASC, czy malejąco DESC),
domyślnie indeks jest posortowany rosnąco
ON grupa_plików
określa grupę plików w których indeks ma być tworzony
PAD_INDEX
określa, że powinna być zostawiona przestrzeń dla przyszłych aktualizacji
indeksów (przydaje się np. przy atrybutach typu varchar)
FILLFACTOR=
współczynnik_wypełnie
nia
określa jaki procent bloku ma zostać zapełniony
IGNORE_DUP_KEY
DROP_EXISTING
używany z klauzula UNIQUE. Jeśli nie będzie klauzuli IGNORE_DUP_KEY, i
wystąpi próba dodania indeksu o istniejącej wartości – wówczas indeks nie
zostanie utworzony, jeśli natomiast tworzymy indeks z klauzulą
IGNORE_DUP_KEY to w tej samej sytuacji zdublowany klucz zostanie
odrzucony, ale indeks zostanie utworzony
używany do ponownego tworzenia istniejących indeksów, przy tworzeniu
indeksów klastrowych można odczuć wzrost wydajności, ponieważ tworzą się na
nowo indeksy nieklastrowe
STATISTICS_NO_RECOMPU
TE
oznacza, że statystyki indeksu nie maja być na bieżąco uaktualniane
SORT_IN_TEMPDB
oznacza, że pośrednie wyniki sortowania maja być przechowywane w bazie
tempdb, jeśli baza ta znajduje się na innym dysku niż baza z danymi
użytkownika to znacznie zwiększa to wydajność
Ograniczenia i indeksy
Użycie polecenia CREATE INDEX lub deklaracja ograniczenia PRIMARY KAY lub
UNIQUE powoduje utworzenie różnowartościowego indeksu na jednej lub kilku kolumnach.
Nie ma znaczenia (z punktu widzenia wewnętrznych mechanizmów przechowywania i
obsługi indeksów), w jaki sposób został utworzony indeks różnowartościowy. Optymalizatora
kwerend nie interesuje, w jaki sposób powstał indeks. Tworząc tabelę z ograniczeniami,
PRIMARY KEY lub UNIQUE, można określić czy skojarzony indeks będzie zgrupowany
czy niezgrupowany oraz podać wartość fillfactor. Największą różnicą między tworzeniem
indeksów przez polecenie CREATE INDEX i tworzeniem indeksów obsługujących
ograniczenia jest usuwanie indeksu.
4
Polecenie DROP INDEX umożliwia usuwanie tylko indeksów, które zostały
zbudowane za pomocą CREATE INDEX. Aby usunąć indeksy obsługujące ograniczenia,
należy usunąć ograniczenia za pomocą ALTER TABLE. Oprócz tego, aby usunąć
ograniczenia PRIMARY KEY lub UNIQUE, dla którego wymuszone jest ograniczenie
FOREGIN KEY, trzeba najpierw usunąć to ograniczenie. W czasie przedefiniowywania
ograniczeń i przebudowywania indeksów (nie utworzonych poleceniem CREATE INDEX)
może prowadzić do powstania niebezpiecznego „okna czasowego”. Po zdjęciu ograniczenia
FOREIGN KEY instrukcja INSERT może dodawać do tabeli wiersz naruszający integralność
referencyjną.. Jednym ze sposobów uniknięcia tego problemu jest zastosowanie polecenia
DBCC DBREINDEX. Polecenie to przebudowuje wszystkie indeksy tabeli w jednej operacji.
Dla których kolumn tworzyć indeksy?
Indeksy z wyjątkiem grupujących w pewnych sytuacjach mogą wydłużać czas operacji
wstawiania i modyfikowania danych.
Indeks grupujący powinien być tworzony dla kolumny, według której użytkownicy
często sortują dane odczytywane z tabeli lub dla kolumn przechowujących wartości, na
podstawie których zwracane są zbiory danych.
Dla indeksów niegrupujących odpowiednimi kandydatami są kolumny, które
•
przechowują wartości częściej odczytywane niż modyfikowane,
•
wykorzystywane są do łączenia lub wyszukiwania danych,
•
przechowują różnorodne wartości.
W praktyce indeksy tworzymy dla:
•
kolumn z ograniczeniem PRIMARY KEY,
•
kolumn z ograniczeniem FOREGIN KEY oraz kolumn wykorzystywanych przy
łączeniu tabel,
•
kolumn przechowujących dane wykorzystywane jako argument wyszukiwania,
•
kolumn przechowujących często sortowane dane.
Uwaga Nie jest możliwe założenie indeksu dla kolumn przechowujących dane typu
bit, text, ntext, image.
1. Stwórz indeks dla tabeli WYKONAWCY dla kolumny Nazwisko posortowane
malejąco
5
2. Stwórz indeks dla tabeli WYKONAWCY dla kolumny Pseudonim posortowane
rosnąco, indeks powinien być unikatowy, ustaw odrzucanie zdublowanego klucza, i
ustaw 50% wolnego miejsca
3. Stwórz indeks dla tabeli WYKONAWCY dla kolumn Nazwisko i Pseudonim
4. Dla tabeli PRACOWNICY stwórz indeks dla kolumn Stanowisko i Id_Dzialu
5. Dla tabeli PRACOWNICY stwórz indeks dla kolumny Nazwisko
6

Podobne dokumenty