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