SQLShack (Čeština)
Indexy se používají k urychlení procesu dotazování na serveru SQL Server, což vede k vysoké výkon. Jsou podobné indexům učebnic. Pokud v učebnicích potřebujete přejít na určitou kapitolu, přejděte do rejstříku, vyhledejte číslo stránky kapitoly a přejděte přímo na tuto stránku. Bez indexů by byl proces hledání požadované kapitoly velmi pomalý.
Totéž platí pro indexy v databázích. Bez indexů musí DBMS projít všechny záznamy v tabulce, aby získal požadované výsledky. Tento proces se nazývá skenování tabulky a je extrémně pomalý. Na druhou stranu, pokud vytvoříte indexy, databáze nejprve přejde do tohoto indexu a poté přímo načte odpovídající záznamy tabulky.
Na serveru SQL Server existují dva typy indexů:
- Klastrovaný index
- Klastrovaný index
Klastrovaný index
Klastrovaný index definuje pořadí, ve kterém jsou data fyzicky uložena v tabulce. Data tabulky lze třídit pouze způsobem, proto na každou tabulku může existovat pouze jeden seskupený index. Na serveru SQL Server omezení primárního klíče automaticky vytvoří seskupený index v daném sloupci.
Podívejme se na to. Nejprve vytvořte tabulku „student“ uvnitř „schooldb“ provedením následujícího skriptu, nebo se ujistěte, že je vaše databáze plně zálohována, pokud používáte svá živá data:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
VYTVOŘIT DATABÁZE schooldb
student VYTVOŘIT TABULKU
(
id INT PRIMARY KEY,
jméno VARCHAR (50) NOT NULL,
pohlaví VARCHAR (50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
město VARCHAR (50) NOT NULL
)
|
upozornění zde v tabulce „student“ jsme nastavili prima omezení ry klíč ve sloupci „id“. Tím se automaticky vytvoří seskupený index ve sloupci „id“. Chcete-li zobrazit všechny indexy v konkrétní tabulce, spusťte uloženou proceduru „sp_helpindex“. Tato uložená procedura přijímá název tabulky jako parametr a načte všechny indexy tabulky. Následující dotaz načte indexy vytvořené v tabulce studentů.
1
2
3
4
5
|
POUŽITÍ schooldb
PROVÉST student sp_helpindex
|
Výše uvedený dotaz vrátí tento výsledek:
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | klastrovaný, jedinečný, primární klíč umístěný na PRIMARY | id |
Ve výstupu vidíte jediný index. Toto je index, který byl automaticky vytvořen z důvodu omezení primárního klíče ve sloupci „id“.
Tento seskupený index uloží záznam do tabulky studentů ve vzestupném pořadí podle „id“. Pokud má tedy vložený záznam id 5, bude záznam vložen do 5. řádku tabulky místo do prvního řádku. Podobně, pokud má čtvrtý záznam ID 3, bude vložen do třetí řady místo do čtvrté řady. Důvodem je, že seskupený index musí udržovat fyzické pořadí uložených záznamů podle indexovaného sloupce, tj. Id. Chcete-li vidět toto řazení v akci, proveďte následující skript:
Výše uvedený skript vloží do tabulky studentů deset záznamů. Všimněte si zde, že záznamy jsou vkládány v náhodném pořadí hodnot ve sloupci „id“. Ale kvůli výchozímu seskupenému indexu ve sloupci id jsou záznamy fyzicky uloženy ve vzestupném pořadí hodnot ve sloupci „id“. Proveďte následující příkaz SELECT a načtěte záznamy ze studentské tabulky.
1
2
3
4
5
|
USE schooldb
VÝBĚR * OD studenta
|
Záznamy budou načteny v následujícím pořadí:
Vytvoření vlastního seskupeného indexu
Můžete si vytvořit vlastní vlastní index a také výchozí seskupený index. Chcete-li vytvořit nový seskupený index v tabulce, musíte nejprve odstranit předchozí index.
Chcete-li odstranit index, přejděte do části „Object Explorer- > Databáze- > Database_Name- > Tabulky – > název_tabulky – > rejstříky“. Klikněte pravým tlačítkem na index, který chcete smazat, a vyberte ODSTRANIT . Viz následující snímek obrazovky.
Nyní, Chcete-li vytvořit nový seskupený index, proveďte následující skript:
1
2
3
4
5
6
|
použít schooldb
VYTVOŘIT CLUSTEROVANÝ INDEX IX_tblStudent_Gender_Score
ON student (gender ASC, total_score DESC)
|
Proces tvorby seskupený index je podobný normálnímu indexu s jednou výjimkou. U seskupeného indexu musíte použít klíčové slovo „CLUSTERED“ před „INDEX“.
Výše uvedený skript vytvoří seskupený index s názvem „IX_tblStudent_Gender_Score“ na studentské tabulce. Tento index je vytvořen ve sloupcích „gender“ a „total_score“. Index, který je vytvořen ve více než jednom sloupci, se nazývá „složený index“.
Výše uvedený index nejprve seřadí všechny záznamy ve vzestupném pořadí podle pohlaví. Pokud je pohlaví stejné pro dva nebo více záznamů, jsou záznamy seřazeny v sestupném pořadí podle hodnot ve sloupci „total_score“. Můžete také vytvořit seskupený index v jednom sloupci. Pokud nyní vyberete všechny záznamy z studentská tabulka, budou načteny v následujícím pořadí:
Neseskupené indexy
Neseskupený index neuspořádá fyzická data uvnitř tabulky. Ve skutečnosti index bez seskupení je uložen na jednom místě a data tabulky jsou uložena na jiném místě. Je to podobné jako v učebnici, kde je obsah knihy umístěn na jednom místě a index je umístěn na jiném místě. To umožňuje více než jeden seskupený index na tabulku.
Zde je důležité zmínit, že v tabulce budou data tříděna podle seskupeného indexu. Uvnitř dat bez seskupení jsou však data uložena v zadaném pořadí. Index obsahuje hodnoty sloupců, na kterých je index vytvořen, a adresa záznamu, ke kterému hodnota sloupce patří.
Když je vydán dotaz na sloupec, ve kterém je index vytvořen, databáze nejprve přejde na index a vyhledá adresu příslušného řádku v tabulce. Poté přejde na tuto adresu řádku a načte další hodnoty sloupců. Je to kvůli tomuto dalšímu kroku, že nehrustrované indexy jsou pomalejší než shlukované indexy.
Vytvoření nehrustrovaného indexu
Syntaxe pro vytvoření nehrustrovaného indexu je podobná klastrovaného indexu. V případě ne clusterovaného indexu se však místo „CLUSTERED“ použije klíčové slovo „NONCLUSTERED“. Podívejte se na následující skript.
1
2
3
4
5
6
|
použít schooldb
VYTVOŘIT NEUKLASTOVANÝ INDEX IX_tblStudent_Name
ON student (jméno ASC)
|
Výše uvedený skript vytvoří ve sloupci „name“ studentské tabulky nehrnutý index. Index se seřadí podle názvu ve vzestupném pořadí. Jak jsme již řekli dříve, data tabulky a index budou uloženy na různých místech. Záznamy tabulky budou tříděny podle seskupeného indexu, pokud existuje. Index bude seřazen podle jeho definice a bude uložen samostatně od stolu.
Data tabulky studentů:
Data indexu IX_tblStudent_Name
název | adresa řádku |
Alan | adresa řádku |
Elis | Adresa řádku |
Jolly | Adresa řádku |
Jon | adresa řádku |
Joseph | adresa řádku |
Kate | Adresa řádku |
Laura | Adresa řádku |
Myši | Adresa řádku |
Sara | Adresa řádku |
Moudrá | Adresa řádku |
Upozornění , zde v indexu má každý řádek sloupec, ve kterém je uložena adresa řádku, ke kterému název patří. Pokud je tedy zadán dotaz na načtení pohlaví a DOB studenta jménem „Jon“, databáze nejprve prohledá jméno „Jon“ v indexu. Poté přečte adresu řádku „Jon“ a přejde přímo na tento řádek v tabulce „student“, aby načetl pohlaví a DOB Jon.
Závěr
Z diskuse najdeme následující rozdíly mezi seskupenými a neseskupenými indexy.
- V každé tabulce může být pouze jeden seskupený index. V jedné tabulce však můžete vytvořit více ne-seskupených indexů.
- Seskupené indexy pouze seřadí tabulky. Proto nespotřebovávají další úložiště. Neskupené indexy jsou uloženy na odděleném místě od skutečné tabulky, která vyžaduje více úložného prostoru.
- Seskupené indexy jsou rychlejší než neseskupené indexy, protože nezahrnují žádný další krok vyhledávání.
Další skvělé články od Bena
Rozdíl mezi identitou & Sekvence na serveru SQL Server
Jaký je rozdíl mezi klastrovanými a ne clusterovanými indexy na serveru SQL Server?
- Autor
- Poslední příspěvky
Zobrazit všechny příspěvky od Ben Richardson
- Power BI: Waterfall Charts and Combined Visuals – 19. ledna 2021
- Power BI : Podmíněné formátování a barvy dat v akci – 14. ledna 2021
- Power BI: Import dat ze serveru SQL Server a MySQL – 12. ledna 2021
573 279 zhlédnutí
© 2021 Quest Software Inc. VŠECHNA PRÁVA VYHRAZENA. | GDPR | Podmínky použití | Ochrana osobních údajů