sql >> Databáze >  >> RDS >> Sqlserver

Pět hlavních úvah pro návrh indexu databáze na serveru SQL Server

Databázové indexy se používají k urychlení různých operací s tabulkami. Než však vytvoříte index, je důležité vědět, zda index skutečně potřebujete? A pokud potřebujete vytvořit index, jaké jsou důležité body, které je třeba mít na paměti? Zde přichází na řadu návrh indexu databáze.

Tento článek si klade za cíl odpovědět na tyto otázky o návrhu indexu databáze a osvětlit některé z hlavních úvah, které by měl vývojář databáze vzít v úvahu při navrhování indexu.

1. Velikost tabulky

První otázkou, kterou si musí vývojář databáze před vytvořením indexu položit, je, zda je tabulka dostatečně velká, aby efektivně využívala indexy. Pokud je velikost tabulky malá, může stroj SQL Server prohledat celou tabulku rychleji než prohledávat tabulku pomocí indexu. Indexy v takovém případě nemají využití a vytvářejí režii při provádění databázových operací.

2. Typy sloupců

Indexy by měly být vytvořeny ve sloupci primárního klíče nebo libovolném sloupci, který obsahuje jedinečné hodnoty a který má omezení NOT NULL. Dále je vhodné vytvořit indexy na číselných sloupcích, protože číselné sloupce mají tendenci mít více jedinečných hodnot ve srovnání s nečíselnými sloupci. Špatný návrh indexu databáze používá indexy na sloupcích, které mají velmi málo jedinečných položek a mohou mít za následek velmi časově náročné dotazy.

Vezměme si tabulku s názvem Pacienti, která obsahuje stovky tisíc záznamů. Tabulka Pacienti by obsahovala sloupec nazvaný „Gender“, který může mít pouze dvě jedinečné hodnoty „Muž“ a „Žena“. Pokud vytvoříte index ve sloupci „Gender Column“, záznamy budou seřazeny podle abecedy vzestupně nebo sestupně.

Pokud tedy máte v tabulce Pacienti milion záznamů a počet pacientů mužského a ženského pohlaví je stejný, v indexu bude mít prvních půl milionu záznamů pohlaví „Žena“ a druhý půl milionu bude mít pohlaví „Muž“. Nyní, pokud chcete vyhledat ženu, která existuje na 490 000. řádku záznamů žen, bude muset SQL Server Engine prohledat 490 000 záznamů. Na druhou stranu, s jedinečnými číselnými hodnotami může být vyhledávání extrémně rychlé, protože indexy SQL Serveru jsou uloženy ve formě B + Stromy, takže číselné hodnoty v uzlech stromu mohou urychlit databázové operace.

3. Počet indexů

Oficiálně můžete pro každou databázovou tabulku vytvořit jeden seskupený index a tolik neshlukovaných indexů, kolik chcete. Dobrým návrhem databázového indexu je však vytvořit jeden shlukovaný index a pouze omezený počet absolutně nezbytných neshlukovaných indexů. Vytváření příliš mnoha indexů bez klastrů může ve skutečnosti zpomalit operace aktualizace a vložení, protože když je záznam aktualizován nebo vložen a hodnota sloupce je změněna, musí být aktualizovány všechny přidružené indexy.

Zvažte scénář, kde máme dva neseskupené indexy, první index seřadí záznamy podle věku a druhý index seřadí záznamy podle pohlaví i věku.

Zde je první index:

Věk

Adresa záznamu

10

Adresa záznamu

22

Adresa záznamu

29

Adresa záznamu

32

Adresa záznamu

33

Adresa záznamu

36

Adresa záznamu

40

Adresa záznamu

49

Adresa záznamu

54

Adresa záznamu

59

Adresa záznamu

A tady je druhý:

Pohlaví Věk Adresa záznamu
Žena 10

Adresa záznamu

Žena 29

Adresa záznamu

Žena 33

Adresa záznamu

Žena 40

Adresa záznamu

Žena 54

Adresa záznamu

Muž 22

Adresa záznamu

Muž 32

Adresa záznamu

Muž 36

Adresa záznamu

Muž 49

Adresa záznamu

Muž 59

Adresa záznamu

Nyní, pokud záznam s věkem 40 let musí být z nějakého důvodu aktualizován na věk 15 let, pak bude muset být aktualizován první index, aby se záznam přesunul ze 7. pozice (40) na druhou pozici, aby byl index zachován. Podobně ve druhém indexu se záznam ve 4. indexu přesune do druhého indexu. Musí dojít k velkému přeskupování. Proto je rozumné udržovat počet indexů na minimu pro sloupce, které jsou pravidelně aktualizovány, když uvažujete o návrhu indexu databáze. Jeden sloupec by také neměl být používán ve více indexech bez klastrů.

4. Umístění úložiště indexů

Umístění úložiště indexu může ovlivnit výkon dotazů, které index používají, a proto je také součástí dobrého návrhu indexu databáze. Ve výchozím nastavení je seskupený index uložen ve stejné skupině souborů jako tabulka, ve které je index vytvořen. U indexů bez klastrů může být index uložen ve stejné skupině souborů nebo v různých skupinách souborů zahrnujících více diskových jednotek. Výkon dotazů neklastrovaných indexů lze výrazně zlepšit ukládáním neklastrovaných indexů na více diskových jednotek. Důvodem je, že se zlepší vstupní/výstupní výkon dotazu v důsledku distribuce dat v různých oblastech disku.

Výchozí umístění úložiště indexů lze také změnit zadáním hodnoty pro volbu FILLFACTOR. Protože jsou indexy fyzicky uloženy ve formě B+ Stromů, jsou data indexu uložena na listových stránkách. Pomocí možnosti FILLFACTOR můžete nastavit procento vyplnění stránek na úrovni listu. Pokud například nastavíte hodnotu FILLFACTOR na 70 %, pouze 70 % celkového prostoru stránky na úrovni listu bude vyplněno daty indexu. Zbývajících 30 % bude ponecháno na automatický růst indexových dat v budoucnu.

5. Typy indexů

Dalším extrémně důležitým faktorem při návrhu indexu databáze je typ indexu, který se má použít. V dřívějším článku (přidejte odkaz na článek „Kdy použít klastrovaný nebo neklastrovaný index“) jsem vysvětlil rozdíl mezi seskupenými a neshlukovanými indexy. Také jsem vysvětlil, co to je a jak se dají použít. Rozhodnutí, zda zvolit shlukovaný nebo neshlukovaný index, je zásadní a mělo by být pečlivě promyšleno.

Při rozhodování, jaký typ indexu zvolit, je třeba mít na paměti následující body.

  1. Pro sloupce, které se používají v dotazech SELECT/JOIN/GROUP BY/BETWEEN, použijte seskupené indexy.
  2. Neshlukované indexy použijte pro sloupce, kde chcete načíst hodnoty pouze z tohoto konkrétního sloupce a nikoli z ostatních sloupců stejného řádku. Dotazy SELECT, které načítají více záznamů pomocí indexu bez klastrů, mohou být pomalé, protože stroj SQL Server nejprve prohledá hodnoty sloupců, na kterých je index vytvořen, a poté pomocí odkazu na řádek pro hodnotu sloupce načte záznamy ze skutečných databázových tabulek. .
  3. Pro sloupce, které často procházejí operacemi INSERT a UPDATE, použijte index bez klastrů. Ujistěte se, že nepoužíváte jeden sloupec ve více indexech bez klastrů, protože to může zpomalit aktualizační dotazy. Seskupené indexy mohou být pomalé pro operace INSERT/UPDATE, protože je třeba aktualizovat celý řádek namísto pouze hodnoty jednoho sloupce, jak je tomu u indexů bez klastrů.
  4. Protože můžete vytvořit pouze jeden seskupený index, v případě, že potřebujete více indexů, použijte neshlukované indexy. Pokud je však velký problém s místem na disku, omezte počet indexů bez klastrů na minimum.

Další úvahy

Ačkoli se jedná o pět nejdůležitějších částí návrhu indexu databáze, nejsou všechno. Je důležité určit správné pořadí sloupců v indexech. Obecně platí, že sloupce, které se používají pro rozhodování v klauzulích WHERE, a podmínky, jako je větší než (>), menší než (<) atd., by měly být umístěny před sloupci, které se těchto klauzulí netýkají. V případě více sloupců v klauzuli WHERE by nejvýraznější názvy sloupců měly být uvedeny nejdříve v definici indexu.

Kromě návrhu indexu databáze hraje důležitou roli v efektivním využití návrhu indexu také návrh dotazů. Pro optimalizovanou údržbu indexu místo psaní více dotazů, které fungují na malém počtu řádků, zkuste napsat méně dotazů, které ovlivňují větší počet řádků tabulky.

Závěr

Tento článek vysvětluje některé hlavní úvahy, které musí vývojář databáze vzít v úvahu při pohledu na návrh indexu databáze. Článek také vysvětluje důvody těchto úvah a obsahuje další návrhy, jak zajistit, aby byl návrh indexu vaší databáze efektivní.


  1. Jak funguje TRY_CONVERT() na serveru SQL Server

  2. Jak používat Průvodce importem/exportem v SQL Server - SQL Server / Výukový program TSQL, část 104

  3. Entity Framework 6 s Npgsql

  4. Nejlepší přístupy pro seskupené průběžné součty