Encyklopedia SQL - Indeksowanie tabel, indeks klastrowy i nieklastrowy
Autor: Paweł Wilkosz
Opublikowano: 2012-02-07
Kontynuując cykl publikacji Encyklopedia SQL chciałbym zaprezentować jedno z ważniejszych zagadnień w procesie optymalizacji oraz dostrajania bazy danych w zakresie szybkości wykonywania operacji – indeksowanie.
Przed wykonaniem zadań zapoznaj się z następującym materiałem:
Po wykonaniu zadań będziesz wiedział:
- co to są indeksy i jaką rolę pełnią w bazie danych,
- jaka jest różnica pomiędzy indeksem klastrowym i nieklastrowym.
Indeksacja
W większości publikacjach, dotyczących baz danych, indeksy porównuje się ze strukturą książki telefonicznej, a dokładniej mówiąc, samej formy organizacji spisu abonentów (alfabetyczna, podzielona tematycznie itp.). To niby trywialne zestawienie idealnie obrazuje, w jaki sposób indeksy działają oraz jaka jest ich architektura w systemie do zarządzania bazami danych. Brnąc przez kolejne przykłady, w poprzednich częściach Encyklopedii SQL, czytelnik nie spotkał się bezpośrednio z zagadnieniem indeksacji kolumn. Można więc zaryzykować twierdzenie, iż mechanizm ten praktycznie nie jest potrzebny w codziennej pracy z magazynem danych. Niestety śmiałość tej tezy nie odnosi się do wewnętrznych mechanizmów serwera SQL, który wykorzystuje indeksy, aby poradzić sobie z mnogością informacji podczas selekcji, sortowania, wyszukiwania itp. Działanie indeksów jest przezroczyste dla użytkownika końcowego, ale kluczowe dla SQL Server. Dlatego, bez wątpienia, zapoznaj się z tą techniką optymalizacji.
Indeks klastrowy
W środowisku SQL Server rozróżnia się dwa typy indeksów: klastrowy (clustered) i nieklastrowy (nonclustered), często nazywanymi również grupującymi i niegrupującymi. SQL Server 2008 definiuje również dwa dodatkowe indeksy: PrimaryXML oraz Spatial, lecz ze względu na złożoność tematyki, nie będą one omawianie w niniejszej publikacji. Clustered Index swoją strukturą najbardziej przypomina książkę telefoniczną z ułożonymi alfabetycznie wpisami. Indeks ten nie jest odrębnym obiektem składowanym na dysku twardym. Jego podstawowym zadaniem jest narzucanie tabelom, w jaki sposób mają zapisywać wiersze na kolejnych stronach. Istotną informacją jest fakt, iż po utworzeniu indeksu grupującego, struktura stron tabeli podlega reorganizacji wg wskazań indeksu. Oczywiście w obrębie jednej tabeli może znajdować się tylko jeden indeks klastrowy, gdyż jak wskazuje logika, nie można uporządkować danych na kilka sposobów (np. książka telefoniczna jest posegregowana wg jednego klucza – spis alfabetyczny). Dobrą praktyką jest wskazywanie klucza głównego danej tabeli jako indeksu klastrowanego.
Aby utworzyć indeks klastrowy w SQL Server, z poziomu języka T-SQL, należy wykonać następujące zapytanie:
CREATE UNIQUE CLUSTERED INDEX nazwa_indeksu
ON nazwa_tabeli(kolumna)
W SQL Server Management Studio w strukturze Object Browser->Database->Indexes powinny znajdować się wartości wszystkich utworzonych indeksów. Na Rys. 1 został przedstawiony indeks klastrowy o nazwie PK_Employee_EmployeeID w tabeli HumanResources.Employee, bazy danych AdventureWorks, założony na kolumnie EmployeeID, będącym notabene kluczem głównym omawianej tablicy.
Rys. 1. Indeks klastrowy tablicy HumanResources.Employee, bazy danych AdventureWorks.
Indeks nieklastrowy
Indeks nieklastrowy (niegrupujący), w przeciwieństwie do Clustered Index, zapisywany jest na zupełnie oddzielonych od tabeli stronach. Tego typu technikę można porównać do indeksu słów kluczowych, znajdujących się na końcu każdej książki. W SQL Server indeks nieklastrowy wskazuje na dokładnie jeden wiersz w tabeli (co stanowi różnicę pomiędzy książkowym rozwiązaniem). Ponieważ Nonclustered index nie wpływa na organizację stron tabeli, dla klażdej z nich można wykorzystać maksymalnie 249 indeksów.
Poniższe polecenie tworzy indeks nieklastrowy w T-SQL:
CREATE NONCLUSTERED INDEX nazwa_indeksu
ON nazwa_tabeli(kolumna)
Przykładowo indeks nieklastrowy (AK_Department_Name), tabeli HumanResources.Department, bazy AdventureWorks został zaprezentowany na Rys. 2.
Rys. 2. Indeks nieklastrowy tabeli HumanResources.Department.
Indeks kompozytowy
W celu zwiększenia optymalizacji operacji na bazie danych, kolumny, do których programiści odwołują się najczęściej (np. imię i nazwisko, bądź adres zamieszkania i miasto), można pogrupować w ramach pojedynczego indeksu kompozytowego (Composite Index). Ważne jest, aby wszystkie kolumny, wchodzące w skład indeksu kompozytowego, znajdowały się w obrębie tej samej tabeli. Aby utworzyć indeks kompozytowy na kolumnach: FirstName, LastName, tabeli Person.Contact, bazy danych AdventureWorks, należy wykonać następujące zapytanie:
CREATE INDEX Composite_FirstName_LastName
ON Person.Contact
(
FirstName,
LastName
)
Na jakie kolumny warto zakładać indeksy
Dobre praktyki projektowania baz danych wskazują, iż:
- Indeksy powinno zakładać się na kolumnach rzadko modyfikowanych.
- Największą optymalizację uzyska się, zakładając indeks na kolumnach wykorzystywanych do warunków złączeniowych, jako kluczy do wyszukiwania danych bądź sortowania zbioru wynikowego.
- Kolumny typu PRIMARY/FOREIGN KEY powinny zawierać indeksy: klastrowy i nieklastrowy.
Informacja |
Zapamiętaj, że:
|
Podsumowanie
Z niniejszej publikacji dowiedziałeś się, w jaki sposób wykorzystać indeksy do wprowadzenia wstępnej optymalizacji pracy serwera SQL.
W kolejnej publikacji nauczysz się, w jaki sposób efektywnie pracować z procedurami składowanymi.
Dodatkowo zobacz: