Heap tables in SQL Server

v posledním příspěvku této řady blogů jsem diskutoval o tom, co je index B-stromu, a stručně vysvětlil jeho historii.

než se ponoříme do indexů, které SQL Server používá, je důležité nastavit základy datových struktur. Nejzákladnější tabulka, kterou můžete vytvořit, je halda. Halda je netříděná struktura stránek, které nejsou vzájemně propojeny.

kdy byste měli používat hromady?

doporučením osvědčených postupů je vyhnout se hromadám SQL Serveru ve většině případů. Kimberly Tripp zde vysvětluje některé důvody a debatu, ale budu se zabývat vysokou úrovní. Hromady, které jsou nejzákladnější strukturou úložiště, postrádají funkce, které zlepšují výkon pro normální pracovní zátěž (OLTP). Někteří tvrdí, že hromady jsou lepší pro operace extrakce, transformace a načítání (ETL), protože během operací zápisu je třeba udržovat méně stránek(aktualizovat/vložit/smazat). Konkrétně mohou být hromady rychlejší než index B-stromu, pokud dojde k rozdělení stránek a je třeba aktualizovat mnoho úrovní indexu. Kromě toho je identifikátor řádku (RID), který je popsán níže, pouze 8 bajtů. To může fungovat lépe než seskupený index se spoustou klíčových sloupců, protože neklustrované indexy musí uložit seskupený klíč nebo RID pro každý indexovaný řádek. Obvykle doporučuji používat seskupený index (více o seskupených indexech, jak pokračujeme v této sérii), spíše než haldu, ale pokud je používáte, použijte je pouze tehdy, pokud jste prokázali, že budou efektivnější než seskupený index. Po projednání struktury haldy, nastíním problémy s výkonem používání hald.

struktura haldy

halda je seskupení netříděných stránek, které nejsou propojeny. Anatomie stránky je pro tuto sérii mimo rozsah, protože všechny typy indexovaných a neindexovaných tabulek používají stejnou strukturu stránek, ale doporučuji vám, abyste se zde a zde dozvěděli více.

halda se skládá z jedné nebo více stránek iam (index allocation map), které odkazují na datové stránky, které tvoří haldu. Jedinou výjimkou je, když máte řádek, který byl aktualizován a už se na jeho stránku nevejde. V takovém případě získáte ukazatel přesměrování na řádek, který byl přesunut na existující stránku s mezerou nebo novou stránkou. Je možné, abyste vytvořili řetězec spedičních záznamů, pokud řádek nadále potřebuje přemístění dalšími operacemi.

heap-structure-1

odkaz na obrázek: MSDN

halda má jeden řádek v sys.oddíly na oddíl a jeho index_id se budou rovnat nule. V tomto záznamu ukazuje first_iam_page na první ze stránek mapy přidělování indexů (iam). Stránka IAM mapuje stránky pro každou alokační jednotku a spravuje 4 GB kusů tabulky. Alokační jednotky zahrnují:

  1. in_row_data alokační jednotka
  2. LOB_DATA alokační jednotka
  3. row_overflow_data alokační jednotka

stránka IAM obsahuje standardní 96bajtovou hlavičku následovanou hlavičkou IAM. Záhlaví IAM začíná osmi sloty pro smíšené přidělení rozsahu a poté bitovou mapou 8000-byte pro nalezení jednotných rozsahů přidělených tabulce.

smíšený rozsah je ten, který obsahuje stránky z více než jedné tabulky. Toto je také označováno jako sdílený rozsah. Účelem smíšeného rozsahu je ušetřit místo s tabulkami menšími než 64 KB. Jednotný rozsah je ten, kde všechny stránky v rozsahu patří do této jediné tabulky.

mixed-extent

odkaz na obrázek: rozsah

abychom mohli prozkoumat naši stránku IAM, musíme ji nejprve najít.

DBCC IND (‚demo‘, ‚ dbo.demo‘,1)

dbcc-ind

s DBCC IND máme 17 datových stránek a 1 iam stránku. Iam stránky nejsou self-odkazování, proto IAMFID (iam file Id) a IAMPID (iam page Id) jsou NULL. To znamená, že naše IAM stránka je v souboru Id (PageFID) 1 a je page Id (PagePID) 297. Stránka DBCC nám umožní zobrazit naši stránku IAM.

DBCC TRACEON(3604);

stránka DBCC (‚demo‘,1,297,3);

dbcc-page-iam

ve žlutém je osm jednostránkových přídělů v našem smíšeném rozsahu. Oranžově jsou jednotné rozsahy zobrazeny v rozsazích.

důsledky výkonu

provádění různých operací jazyka manipulace s daty (DML) na haldě má tyto účinky.

  • vložit-nové řádky lze umístit na první dostupnou stránku s dostatečným prostorem. Takže kdykoli je vložen nový řádek, bude pravděpodobně přidán na poslední stránku.
  • aktualizace-řádky mohou zůstat na stejné stránce, pokud se po aktualizaci hodí na stránku, pokud ne, budou odstraněny z aktuální stránky a umístěny na první dostupnou stránku s dostatečným prostorem a ukazatel přesměrování je zapsán na původní stránku.
  • smazat-Data nejsou přepsána, místo je pouze označeno jako dostupné pro opětovné použití. To může způsobit, že váš stůl spotřebuje výrazně více místa na disku, než je nutné.
  • SELECT-pro většinu dotazů bude třeba přečíst skenování tabulky na celé tabulce. Výjimkou je situace, kdy je k dispozici vhodný neklustrovaný index. Budeme diskutovat non-clustered indexy později v této sérii.

čte

bez jakéhokoli podpůrného indexu vyžaduje halda úplnou kontrolu tabulky pro jakýkoli dotaz. Je to proto, že fyzická struktura není tříděna a neexistuje žádný odkaz na stránku, která by podporovala skenování rozsahu.

nastavení statistiky IO na

DBCC IND (‚demo‘, ‚ dbo.demo‘,1)

vyberte počet ( * )
z dbo.demo

opakování našeho příkazu DBCC IND shora nám připomíná, že pro tuto tabulku máme 18 stránek. 17 datových stránek a 1 IAM strana.

– odstraněny výsledky DBCC Ind, protože jsou již zobrazeny výše.
-18 řádek výsledek, označuje 18 stran.

(18 řádek (y) ovlivněno)
provedení DBCC dokončeno. Pokud DBCC vytiskne chybové zprávy, obraťte se na správce systému.

počet řádků
—-
5031
(1 řádek (y) ovlivněno)

tabulka ‚Demo‘. Počet skenování 1, logické čtení 17, fyzické Čtení 0, čtení před čtením 0, logické čtení lob 0, fyzické čtení lob 0, čtení před čtením lob 0.
(1 řádek (y) ovlivněno)

Všimněte si 17 logických čtení z našeho dotazu. Je to proto, že stránka IAM není započítána do logické metriky čtení a provedli jsme úplné skenování tabulky s 18 stránkami.

zapisuje a předává ukazatele

jak bylo uvedeno výše, vložky a mazání jsou poměrně přímočaré. Vložka se objeví na první stránce s dostupným prostorem, i když to znamená vytvoření nové stránky. Odstranění se provádí de-přidělením místa, které řádek zabíral.

aktualizace jsou místem, kde věci jdou z kopce pro hromady. Při aktualizaci datového typu s pevnou délkou dojde k aktualizaci na místě. Pokud je datový typ proměnné délky aktualizován a délka se zvětšila, existuje šance, že se řádek již nevejde na stejnou stránku. Když se řádek již nehodí, ukazatel přesměrování se vloží do prostoru, kde byl původní řádek, a řádek se přemístí na novou stránku. Tento proces má negativní dopad na výkon čtení. Předvedeme to.

původně všechny naše záznamy v dbo.demo tabulka obsahovala VARCHARs s 9 znakové řetězce.

vyberte TOP 5 *
z dbo.demo

 data demo tabulky

Chcete-li vytvořit některé ukazatele vpřed, aktualizujeme všechny naše řádky a zvětšíme délku sloupce varLen.

aktualizace dbo.demo
set varLen = replicate (‚a‘,100)

nyní máme 95 stránky v naší haldě, protože všechny naše řádky byly přemístěny na nové stránky s ukazateli vpřed, které zůstaly pozadu.

DBCC IND (‚demo‘, ‚ dbo.demo‘,1)

dbcc-output-1

jak si dokážete představit, s hromadami vyžadujícími Úplné skenování tabulky, nyní budeme muset přečíst mnohem více stránek pro stejné množství záznamů.

nastavte statistiky IO na

vyberte počet (*)
z dbo.demo
(1 řádek (y) ovlivněno)

tabulka ‚Demo‘. Počet skenování 1, logické čtení 4405, fyzické Čtení 0, čtení před čtením 0, logické čtení lob 0, fyzické čtení lob 0, čtení před čtením lob 0.

naše čtení se drasticky zvýšilo, protože původní stránky musely být přečteny a poté musely být dodrženy ukazatele vpřed. Dopad na výkon a ztráta místa v paměti a na disku je důvod, proč potřebujeme seskupené indexy.

příště

datová struktura haldy není indexem a je často nejhorší datovou strukturou pro vaše tabulky v SQL Serveru. Dnes jsme to pokryli jako základ porozumění, který bude užitečný při diskusi o indexech. V další části této série budou pokryty seskupené indexy, struktura B+stromu pro data tabulky.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.