Zakładanie indeksu w SQL Server
Jak stworzyć indeks
Aby stworzyć prosty indeks w SQL Server należy opanować instrukcję CREATE INDEX. Ma ona mnóstwo opcji i nie wszystkie zostaną tutaj przedstawione. Wydaje mi się, że zaprezentowane tutaj przykłady wystarczą na większość przypadków. Najprostszy przykład mógłby wyglądać następująco:
CREATE TABLE Tabela
(
Kolumna int
)
--tworzenie indeksu na kolumnie 'Kolumna'
CREATE INDEX IX_Kolumna ON Tabela(Kolumna)
Samo założenie indeksu sprowadza się do napisania słów kluczowych CREATE INDEX, nazwy indeksu, słowa kluczowego ON, a następnie nazwy tabeli, po której w nawiasie pojawia się nazwa kolumny. Wygląda prosto i takie w rzeczywistości jest. Nic nie stoi na przeszkodzie, aby stworzyć indeks z dwóch kolumn. Skrypt mógłby przybrać wtedy następującą postać:
CREATE TABLE Tabela
(
Kolumna1 int,
Kolumna2 nvarchar(5)
)
--tworzenie indeksu na kolumnach 'Kolumna1' i 'Kolumna2'
CREATE INDEX IX_Kolumny ON Tabela(Kolumna1, Kolumna2)
Tworzenie indeksu unikalnego (inikatowego)
Czasami zachodzi taka potrzeba, aby zapewnić unikalność wartości w danej kolumnie. W takim przypadku należy na niej założyć indeks unikalny. Aby dało się założyć taki indeks, wartości w danej kolumnie (lub w wielu kolumnach, gdy zakładamy indeks na wielu kolumnach) muszą być różne. W zdecydowanej większości przypadków pola muszą być zdefiniowane jako NOT NULL, ponieważ dwie wartości NULL interpretowane są jako te same wartości. Trudno sobie wyobrazić, aby na dużej tabeli występowała tylko jedna wartość NULL. Dlaczego dużej tabeli? Bo na małej najczęściej nie ma sensu zakładać indeksów, chyba, że spodziewamy się, że wkrótce może urosnąć (lub jest to klucz główny, który automatycznie tworzy indeks). Przykład założenia indeksu unikalnego pokazany jest poniżej.
CREATE TABLE Tabela
(
Kolumna1 int,
Kolumna2 nvarchar(50)
)
--tworzenie indeksu na kolumnie 'Kolumna1'
CREATE UNIQUE INDEX IX_Kolumna1 ON Tabela(Kolumna1)
Czas teraz na sprawdzenie, czy nasz indeks prawdziwie pilnuje unikalności wartości w kolumnie numer 1. W celu weryfikacji posłużę się następującym skryptem:
INSERT INTO Tabela VALUES(1,'Zakładanie indeksu')
INSERT INTO Tabela VALUES(1,'Tworzenie indeksu')
W odpowiedzi otrzymamy następujący komunikat:
Cannot insert duplicate key row in object 'dbo.Tabela' with unique index 'IX_Kolumna1'. The duplicate key value is (1).
Komunikat informuje nas, że uzyskaliśmy dokładnie to, czego oczekiwaliśmy.
Tworzenie indeksu klastrowanego i nieklastrowanego
Różnice w indeksach klastrowanych i nieklastrowanych oraz ich konsekwencje zostały poruszone w oddzielnym wpisie, więc nie będą tutaj poruszane. Dla leniwych napiszę, że indeks klastrowany określa rzeczywiste położenie danych na dysku, tj. ich fizyczny porządek, kolejność w jakiej są umieszczone. Logiczne w tym kontekście staje się fakt, że może być tylko jeden indeks klastrowany, bo nie da się jednocześnie ułożyć danych w dwóch różnych kolejnościach (tak jak nie da się, aby jeden ciąg kilku różnych liczb był jednocześnie rosnący i malejący). Różnica w tworzeniu tych dwóch różnych indeksów jest bardzo niewielka i została przedstawiona w kodzie poniżej:
CREATE TABLE Tabela
(
Kolumna1 int,
Kolumna2 nvarchar(50)
)
--tworzenie indeksu klastrowanego na kolumnie 'Kolumna1'
CREATE CLUSTERED INDEX IX_Kolumna1 ON Tabela(Kolumna1)
--tworzenie indeksu nieklastrowanego na kolumnie 'Kolumna2'
CREATE NONCLUSTERED INDEX IX_Kolumna2 ON Tabela(Kolumna2)
Ta subtelna różnica to umieszczenie przed słowem kluczowym INDEX słowa kluczowego CLUSTERED dla indeksu klastrowanego, lub słowa kluczowego NONCLUSTERED dla indeksu nieklastrowanego.
Definiowanie porządku kolumn
Dość powszechną praktyką jest definiowanie w indeksie porządku, w jakim klucze będą posortowane. Służą do tego dwa słowa kluczowe ASC i DESC. ASC definiuje porządek rosnący, a DESC malejący.
Fragment skrytpu, który definiuje porządek kluczy indeksu pokazany jest poniżej:
CREATE TABLE Tabela
(
Kolumna1 int,
Kolumna2 nvarchar(50)
)
--tworzenie indeksu na kolumnach 'Kolumna1' i 'Kolumna2'
CREATE INDEX IX_Kolumny ON Tabela(Kolumna1 ASC, Kolumna2 DESC)
Podsumowanie
Zaprezentowane techniki w żadnym wypadku nie wyczerpują tematu zakładania indeksów. Bardziej zaawansowane techniki zostaną opisane oddzielnie. Zachęcam do dzielenia się spostrzeżeniami i sugestiami w komentarzach.
Kategoria:IndeksySQL Server
Komentarze: