Databázové indexy se používají ke zlepšení rychlosti databázových operací v tabulce s velkým počtem záznamů. Databázové indexy (jak seskupené indexy, tak i neklastrované indexy) jsou svou funkčností velmi podobné knižním indexům. Knižní rejstřík vám umožňuje přejít přímo k různým tématům probíraným v knize. Pokud chcete vyhledat konkrétní téma, stačí přejít na index, najít číslo stránky, která obsahuje hledané téma, a pak můžete přejít přímo na tuto stránku. Bez rejstříku byste museli prohledávat celou knihu.
Databázové indexy fungují stejným způsobem. Bez indexů byste museli prohledat celou tabulku, abyste mohli provést konkrétní databázovou operaci. S indexy nemusíte prohledávat všechny záznamy tabulky. Index vás odkazuje přímo na záznam, který hledáte, čímž se výrazně zkracuje doba provádění dotazu.
Indexy SQL Server lze rozdělit do dvou hlavních typů:
- Seskupené indexy
- Neshlukované indexy
V tomto článku se podíváme na to, co jsou shlukovaný a neshlukovaný index, jak se vytvářejí a jaké jsou hlavní rozdíly mezi nimi. Podíváme se také na to, kdy použít clusterované nebo neklastrované indexy v SQL Server.
Začněme nejprve seskupeným indexem.
Shlukovaný index
Klastrovaný index je index, který definuje fyzické pořadí, ve kterém jsou záznamy tabulky uloženy v databázi. Protože může existovat pouze jeden způsob, jak jsou záznamy fyzicky uloženy v databázové tabulce, může existovat pouze jeden seskupený index na tabulku. Ve výchozím nastavení je seskupený index vytvořen ve sloupci primárního klíče.
Výchozí seskupené indexy
Pojďme vytvořit fiktivní tabulku se sloupcem primárního klíče, abychom viděli výchozí seskupený index. Spusťte následující skript:
CREATE DATABASE Hospital
CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)
Výše uvedený skript vytvoří fiktivní databázi Hospital. Databáze má 4 sloupce:id, jméno, pohlaví, věk. Sloupec id je sloupec primárního klíče. Po provedení výše uvedeného skriptu se ve sloupci id automaticky vytvoří seskupený index. Chcete-li zobrazit všechny indexy v tabulce, můžete použít uloženou proceduru „sp_helpindex“.
USE Hospital
EXECUTE sp_helpindex Patients
Zde je výstup:
Můžete vidět název indexu, popis a sloupec, na kterém je index vytvořen. Pokud do tabulky Pacienti přidáte nový záznam, bude uložen ve vzestupném pořadí podle hodnoty ve sloupci id. Pokud má první záznam, který vložíte do tabulky, id tři, záznam se uloží do třetího řádku namísto prvního, protože seskupený index zachovává fyzické pořadí.
Vlastní seskupené indexy
Můžete si vytvořit vlastní seskupené indexy. Než to však uděláte, musíte vytvořit existující seskupený index. Máme jeden seskupený index kvůli sloupci primárního klíče. Pokud odstraníme omezení primárního klíče, bude odstraněn výchozí cluster. Následující skript odstraňuje omezení primárního klíče.
USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO
Následující skript vytvoří vlastní index „IX_tblPatient_Age“ ve sloupci věku v tabulce Pacienti. Díky tomuto indexu budou všechny záznamy v tabulce Pacienti ukládány vzestupně podle věku.
use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)
Nyní přidáme několik fiktivních záznamů do tabulky Pacienti, abychom viděli, zda jsou skutečně vloženy ve vzestupném pořadí podle věku:
USE Hospital
INSERT INTO Patients
VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)
Ve výše uvedeném skriptu přidáme 5 fiktivních záznamů. Všimněte si hodnot ve sloupci věk. Mají náhodné hodnoty a nejsou v žádném logickém pořadí. Protože jsme však vytvořili seskupený index, budou záznamy ve skutečnosti vloženy ve vzestupném pořadí podle hodnoty ve sloupci stáří. Můžete to ověřit výběrem všech záznamů z tabulky Pacienti.
SELECT * FROM Patients
Zde je výstup:
Můžete vidět, že záznamy jsou seřazeny ve vzestupném pořadí hodnot ve sloupci věku.
Neshlukované indexy
Pro urychlení vyhledávacích operací se také používá neshlukovaný index. Na rozdíl od seskupeného indexu neklastrovaný index fyzicky nedefinuje pořadí, ve kterém jsou záznamy vkládány do tabulky. Ve skutečnosti je index bez klastrů uložen na místě odděleném od datové tabulky. Neshlukovaný rejstřík je jako knižní rejstřík, který je umístěn odděleně od hlavního obsahu knihy. Vzhledem k tomu, že neklastrované indexy jsou umístěny v samostatném umístění, může existovat více neklastrovaných indexů na tabulku.
Chcete-li vytvořit index bez klastrů, musíte použít příkaz „CREATE NONCLUSTERED“. Zbytek syntaxe zůstává stejný jako syntaxe pro vytváření seskupeného indexu. Následující skript vytvoří neshlukovaný index „IX_tblPatient_Name“, který seřadí záznamy ve vzestupném pořadí podle jména.
use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)
Výše uvedený skript vytvoří index, který obsahuje jména pacientů a adresy jejich odpovídajících záznamů, jak je uvedeno níže:
Název | Adresa záznamu |
Ana | Adresa záznamu |
Jon | Adresa záznamu |
Mike | Adresa záznamu |
Přezdívka | Adresa záznamu |
Sara | Adresa záznamu |
Zde je „Adresa záznamu“ v každém řádku odkazem na skutečné záznamy v tabulce pro pacienty s odpovídajícími jmény.
Pokud například chcete získat věk a pohlaví pacienta jménem „Mike“, databáze nejprve vyhledá „Mick“ v neseskupeném indexu „IX_tblPatient_Name“ a z neseskupeného indexu načte skutečnou referenci záznamu. a použije to k vrácení skutečného věku a pohlaví pacienta jménem „Mike“
Vzhledem k tomu, že databáze musí provést dvě vyhledávání, nejprve v indexu bez klastrů a poté ve skutečné tabulce, mohou být indexy bez klastrů pro vyhledávací operace pomalejší. Pro operace INSERT a UPDATE jsou však neklastrované indexy rychlejší, protože pořadí záznamů je třeba aktualizovat pouze v indexu a nikoli ve skutečné tabulce.
Kdy použít seskupené nebo neklastrované indexy
Nyní, když znáte rozdíly mezi seskupeným a neshlukovaným indexem, pojďme se podívat na různé scénáře použití každého z nich.
1. Počet indexů
To je docela zřejmé. Pokud potřebujete ve své databázi vytvořit více indexů, použijte index bez klastrů, protože může existovat pouze jeden klastrovaný index.
2. SELECT Operations
Pokud chcete vybrat pouze hodnotu indexu, která se používá k vytvoření a indexování, indexy bez klastrů jsou rychlejší. Pokud jste například vytvořili index ve sloupci „název“ a chcete vybrat pouze název, indexy bez klastrů název rychle vrátí.
Pokud však chcete pomocí indexu jmen vybrat jiné hodnoty sloupců, jako je věk, pohlaví, operace SELECT bude pomalejší, protože nejprve bude jméno prohledáno z indexu a poté bude k vyhledávání použit odkaz na skutečný záznam tabulky. věk a pohlaví.
Na druhou stranu u seskupených indexů, protože všechny záznamy jsou již setříděny, je operace SELECT rychlejší, pokud jsou data vybírána z jiných sloupců, než je sloupec se seskupeným indexem.
3. Operace INSERT/UPDATE
Operace INSERT a UPDATE jsou rychlejší s indexy bez klastrů, protože při provádění operace INSERT nebo UPDATE není nutné řadit skutečné záznamy. Aktualizaci potřebuje spíše pouze index bez klastrů.
4. Místo na disku
Protože jsou neklastrované indexy uloženy na jiném místě než původní tabulka, neshlukované indexy spotřebovávají další místo na disku. Pokud je problém s místem na disku, použijte seskupený index.
5. Konečný verdikt
Obecně platí, že každá tabulka by měla mít alespoň jeden seskupený index, nejlépe ve sloupci, který se používá pro VÝBĚR záznamů a obsahuje jedinečné hodnoty. Sloupec primárního klíče je ideálním kandidátem pro seskupený index.
Na druhou stranu sloupce, které jsou často součástí dotazů INSERT a UPDATE, by měly mít neshlukovaný index za předpokladu, že místo na disku není problém.