Průvodce architekturou stránek a rozsahů

Platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformový systém (PDW)SQL databáze v Microsoft Fabric

Tato příručka popisuje strukturu stránek a rozsahů a uspořádání stránek a rozsahů v datových souborech.

Stránka je základní jednotkou úložiště dat v databázovém stroji. Místo na disku přidělené datovému souboru (.mdf nebo .ndf) v databázi je logicky rozděleno na stránky očíslované souvisle od 0 do n. Vstupně-výstupní operace disku s datovými soubory se provádějí na úrovni stránky. To znamená, že databázový stroj čte nebo zapisuje celé datové stránky.

Rozsah je sbírka osmi fyzicky souvislých stránek, která slouží k efektivní správě stránek. Každá stránka patří do rozsahu.

Soubory transakčního protokolu (.ldf) neobsahují stránky. Obsahují řadu záznamů protokolu, které nemají pevnou velikost.

Stránky

V běžné knize je veškerý obsah napsán na stránkách. Podobně jako v knize zapisuje databázový stroj všechny řádky dat na stránkách. Velikost každé stránky je stejná: 8 KiB. Většina stránek v knize obsahuje data nebo hlavní obsah knihy. Některé stránky obsahují metadata popisující obsah, například obsah a index.

Podobně většina stránek v databázi obsahuje skutečné řádky dat. Tyto stránky se nazývají datové stránky. Textové/LOB stránky také obsahují data, ale používají se pouze datovými typy velkých objektů (LOB). Indexové stránky obsahují struktury indexů, které pomáhají efektivně vyhledávat data. A konečně celá řada systémových stránek ukládá metadata popisující organizaci a vlastnosti dat.

Následující tabulka popisuje typy stránek.

Typ stránky Typ uložených dat
Data Řádky dat se všemi daty Data ve sloupcích používajících datové typy LOB lze také částečně ukládat na datových stránkách.
Text/LOB Data ve sloupcích používajících datové typy LOB, jako je text, ntext, obrázek, varchar(max), nvarchar(max), varbinary(max), xml a json.

Data ve sloupcích s proměnlivou délkou, pokud datový řádek překročí 8 KiB, pro sloupce používající datové typy, jako jsou varchar, nvarchar, varbinary a sql_variant.
Index Indexové struktury B-tree
Mapa globálního přidělení (GAM)

Mapa sdíleného globálního přidělení (SGAM)
Informace o přidělených a nepřidělených rozsahech
Volný prostor stránky (PFS) Informace o přidělení stránky a volném prostoru dostupném na stránkách
Mapa přidělování indexů (IAM) Informace o rozsahech používaných haldou nebo indexem v alokační jednotce
Hromadně změněná mapa (BCM) Informace o rozsahech upravených hromadnými operacemi od posledního zálohování transakčního protokolu.
Diferenciální změněná mapa (DCM) Informace o rozsahech, které se od posledního úplného zálohování databáze změnily.

Každá stránka začíná 96 bajtovým záhlavím, které slouží k ukládání systémových informací o stránce. Tyto informace zahrnují číslo stránky, typ stránky a můžou obsahovat další metadata, jako je ID objektu a ID indexu objektu a indexu, který je vlastníkem stránky.

Struktura, která se nazývá slotové pole, je umístěna na konci stránky. Každý 2-bajtový prvek pole slotů odpovídá řádku uloženému na stránce. Prvek pole slotu ukládá posun bajtů řádku vzhledem k začátku stránky. Databázový stroj používá tyto posuny k vyhledání řádků na stránce.

Když databázový stroj přidá řádek na prázdnou stránku, uloží řádek bezprostředně za záhlavím. Prvek pole slotu pro první řádek je uložen na samém konci stránky. Při přidávání dalších řádků se ukládají po druhém od začátku do konce stránky, zatímco pole slotů roste od konce do začátku stránky, jak je znázorněno na následujícím diagramu.

Diagram datové stránky

Když se řádky na stránce odstraní nebo aktualizují v průběhu času, může se mezi zbývajícími řádky objevit volné místo. Když přidáte nový řádek, může být uložen v tomto volném prostoru, pokud je dostatek místa. To znamená, že řádky na stránce nemusí být fyzicky uložené v žádném konkrétním pořadí. Databázový stroj však udržuje položky pole slotů v logickém pořadí. V důsledku toho se k řádkům na stránce přistupuje také v logickém pořadí, například k pořadí definovanému klíčem indexu BTree, který stránku vlastní.

Podpora velkých řádků

Pokud chcete podporovat velké řádky, které se nevejdou na jednu stránku, část řádku, která se nevejde, se dá uložit na jiné stránky. Maximální velikost dat a režijních nákladů, které mohou být obsaženy v jednom řádku na stránce, je 8 060 bajtů.

Omezení 8 060 bajtů se nevztahuje na data ve sloupcích pomocí datových typů LOB. Ve výchozím nastavení jsou data pro tyto sloupce uložená v řádku, pokud je dostatek místa. V opačném případě řádek obsahuje 16-bajtový ukazatel na samostatný strom textových/LOB stránek, které ukládají LOB data v alokační jednotce LOB_DATA. Toto large value types out of row chování řídí nastavení tabulky.

Omezení 8 060 bajtů je uvolněné pro tabulky a indexy, které obsahují sloupce s proměnlivou délkou pomocí datových typů definovaných uživatelem pomocí varcharu, nvarcharu, varbinary, sql_variant nebo CLR. Pokud celková velikost řádků všech sloupců s pevnou a proměnlivou délkou v haldě nebo indexu překročí omezení 8 060 bajtů, databázový stroj dynamicky přesune jeden nebo více sloupců s proměnlivou délkou na stránky v ROW_OVERFLOW_DATA alokační jednotce počínaje nejširším sloupcem.

To se provádí vždy, když operace vložení nebo aktualizace zvýší celkovou velikost řádku nad limit 8 060 bajtů. Když se sloupec přesune na stránku v ROW_OVERFLOW_DATA alokační jednotce, zachová se ukazatel 24 bajtů na původní stránce v IN_ROW_DATA alokační jednotce. Pokud následná operace zmenšuje velikost řádku, databázový stroj dynamicky přesune sloupce zpět na původní datovou stránku.

Tabulku lze například vytvořit se dvěma sloupci: jeden varchar(7000) a jiný varchar(2000). Jednotlivě ani jeden sloupec nepřekračuje 8 060 bajtů, ale v kombinaci by to udělal, pokud je vyplněná celá šířka každého sloupce. V takovém případě databázový stroj dynamicky přesune sloupec délky proměnné varchar(7000) z původní stránky na stránky v ROW_OVERFLOW_DATA alokační jednotce.

Pokud tabulka nebo index obsahuje sloupce typu varchar, nvarchar, varbinary, sql_variant nebo CLR definované uživatelem, které můžou překročit 8 060 bajtů na řádek, zvažte následující:

  • Přesunutí sloupců na jinou stránku probíhá dynamicky, protože řádky se prodlužují na základě operací aktualizace. Operace aktualizace, které zkracují řádky, můžou způsobit jejich přesunutí zpět na původní stránku v IN_ROW_DATA alokační jednotce.

    Výsledkem tohoto přesunu dat jsou další vstupně-výstupní operace disku. Operace zpracování dotazů, jako jsou řazení nebo spojení u velkých záznamů, které obsahují data přetečení řádků, můžou být pomalejší.

    Proto při návrhu tabulky s více varchar, nvarchar, varbinary, sql_variant nebo CLR uživatelem definovaných sloupců typu zvažte procento řádků, které budou pravděpodobně přetékat, a četnost, s jakou budou tato přetečení data pravděpodobně dotazována. Aby nedošlo k zpomalení výkonu, normalizujte tabulku tak, že některé z těchto sloupců přesunete do jiné tabulky, což sníží nebo zcela eliminuje pravděpodobnost využití úložiště pro přetečení řádků.

  • Délka jednotlivých sloupců musí stále spadat do limitu 8 000 bajtů pro sloupce varchar, nvarchar, varbinary, sql_variant a CLR uživatelem definovaných typů. Pouze jejich kombinované délky můžou překročit limit 8 060 bajtů v tabulce.

  • Součet délek sloupců jiných datových typů, například char, nchar a int , musí být stále v limitu 8 060 bajtů řádku. Sloupce používající datové typy LOB, jako jsou varchar(max), nvarchar(max), a varbinary(max) jsou však vyloučené z limitu řádků 8 060 bajtů.

  • Klíč indexu clusterovaného indexu nemůže obsahovat sloupce varchar , které obsahují data v ROW_OVERFLOW_DATA alokační jednotce. Pokud je clusterovaný index vytvořen ve sloupci varchar a všechna existující data jsou v IN_ROW_DATA alokační jednotce, ale následující příkaz INSERT nebo UPDATE přesune data mimo řádek, dojde k selhání příkazu. Další informace najdete v Architektura indexu a příručka návrhu.

  • Sloupce, které obsahují data přetečení řádků, můžete zahrnout jako klíčové nebo neklíčové součásti neklastrovaného indexu.

  • Limit velikosti řádku pro tabulky, které používají řídké sloupce , je 8 018 bajtů. Při převodu mezi řídkými a neřídkými sloupci se vrátí chyba 576, když převedená data plus existující data překročí 8 018 bajtů. Při převodu sloupců mezi řídkými a neřídkými typy uchovává databázový systém kopii dat aktuálního řádku. Tím se dočasně zdvojnásobí úložiště požadované pro řádek.

  • Pokud chcete získat informace o tabulkách nebo indexech, které můžou obsahovat data přetečení řádků, použijte funkci sys.dm_db_index_physical_stats dynamické správy. Index nebo oddíl obsahuje data přetečení řádků, pokud funkce vrátí řádky, kde sloupec alloc_unit_type_desc je ROW_OVERFLOW_DATA a sloupec page_count je větší než 0.

Rozsahy

Rozsah je soubor osmi fyzicky souvislých stránek. Velikost každého rozsahu je 64 KiB.

Existují dva typy rozsahů:

  • Uniform extent může vlastnit pouze jeden objekt, například jedna tabulka; všech osm stránek v rozsahu může používat pouze vlastnícího objekt.
  • Smíšené rozsahy sdílí až osm objektů. Každá z osmi stránek v rozsahu může být ve vlastnictví jiného objektu.

Diagram znázorňující jednotné a smíšené rozsahy

Databázový stroj až do sql Serveru 2014 (12.x) nepřiděluje jednotné rozsahy tabulkám s malými objemy dat. Nová halda nebo index přiděluje stránky ze smíšených rozsahů. Když halda nebo index naroste na osm stránek, přepne na jednotná rozšíření pro veškeré následné přidělování. Pokud vytvoříte index v existující tabulce, která má dostatek řádků k vygenerování osmi stránek v indexu, budou všechna přidělení indexu v jednotných rozsahech.

Počínaje SQL Serverem 2016 (13.x) používá databázový stroj jednotné rozsahy pro přidělování v uživatelské databázi a v tempdb, s výjimkou přidělení patřících do prvních osmi stránek řetězu IAM. Přidělení v databázích master, msdb a model stále zachovávají předchozí chování.

Včetně verze SQL Serveru 2014 (12.x) lze použít trasovací příznak (TF) 1118 ke změně výchozího přidělení na vždy jednotné rozsahy. Další informace o tomto příznaku trasování naleznete v části příznak trasování 1118.

Od VERZE SQL Server 2016 (13.x) nemá TF 1118 žádný vliv. Funkcionalita, kterou dříve poskytovala TF 1118, je nyní automaticky povolena pro všechny uživatelské databáze a pro tempdb. U uživatelských databází může být toto chování řízeno MIXED_PAGE_ALLOCATION možností databáze. Výchozí hodnota je OFF, což znamená, že se používají jednotné rozsahy. Další informace najdete v tématu Možnosti ALTER DATABASE SET.

Počínaje SQL Serverem 2012 (11.x) může systémová sys.dm_db_database_page_allocations funkce hlásit informace o přidělení stránek pro databázi, tabulku, index a oddíl.

Důležité

sys.dm_db_database_page_allocations Systémová funkce není podporovaná a může se změnit. Kompatibilita není zaručená.

Počínaje SQL Serverem 2019 (15.x) vrátí systémová funkce sys.dm_db_page_info informace o stránce v databázi. Funkce vrátí jeden řádek, který obsahuje data záhlaví stránky, včetně ID objektu, ID indexu a ID oddílu. V mnoha případech lze tuto funkci použít jako podporovanou alternativu pro nepodporovaný DBCC PAGE příkaz.

Systémové stránky

Každý datový soubor obsahuje malý počet speciálních systémových stránek, které sledují metadata popisující rozsahy a stránky. Například systémové stránky sledují, které oblasti v datovém souboru jsou alokovány, a kolik volného místa je na stránkách. Tato část popisuje tyto systémové stránky.

Stránky GAM a SGAM

Databázový stroj používá dva typy map přidělení k zaznamenání přidělení rozsahu:

  • Mapa globálního přidělení (GAM)

    Stránky GAM zaznamenávají rozsahy, které byly přiděleny. Každá stránka GAM pokrývá interval přibližně 64 000 rozsahů nebo přibližně 4 gigabajty (GiB) dat, označovaných jako interval GAM. Stránka GAM má 1 bit pro každý rozsah v intervalu, který pokrývá. Pokud je 1bit, rozsah je volný; pokud je 0bit, rozsah je přidělen.

  • Mapa sdíleného globálního přidělení (SGAM)

    Stránky SGAM zaznamenávají, které rozsahy se aktuálně používají jako smíšené rozsahy, a mají také alespoň jednu nepoužitou stránku. Každá stránka SGAM také pokrývá interval přibližně 64 000 rozsahů, což je asi 4 GiB dat. SGAM má 1 bit pro každý rozsah v intervalu, který pokrývá. Pokud je bit 1, rozsah se používá jako smíšený rozsah a má volnou stránku. Pokud je bit 0, rozsah se nepoužívá jako smíšený rozsah, nebo je to smíšený rozsah, ve kterém se používají všechny stránky.

Pro shrnutí má každý rozsah následující bitové vzory nastavené na stránkách GAM a SGAM na základě jeho aktuálního použití.

Aktuální využití rozsahu Nastavení bitu GAM Nastavení bitů SGAM
Volno, nepoužívá se 1 0
Jednotný rozsah nebo úplný smíšený rozsah 0 0
Smíšený rozsah s volnými stránkami 0 1

Ke správě rozsahů používá databázový stroj následující koncepční algoritmy:

  • Pokud chcete přidělit jednotný rozsah, databázový stroj vyhledá stránku GAM pro 1 bit a nastaví ho na hodnotu 0.
  • Databázový stroj prohledá stránku SGAM, aby našel smíšený rozsah s volnými stránkami, hledajíc bit 1.
  • Pokud chcete přidělit smíšený rozsah, databázový stroj vyhledá na stránce GAM bit 1, nastaví jej na 0 a pak také nastaví odpovídající bit na stránce SGAM na 1.
  • Aby bylo možné uvolnit rozsah, databázový stroj zajistí, aby bit na stránce GAM byl nastaven na 1hodnotu a bit na stránce SGAM je nastaven na 0.

Poměrné přidělování výplní

Databázový stroj přiděluje rozsahy z těch dostupných ve skupině souborů pomocí algoritmu proporcionálního plnění. Například ve skupině souborů se dvěma soubory platí, že pokud jeden soubor zdvojnásobí volné místo druhého, přidělují se z tohoto souboru dvě stránky pro každou stránku přidělenou z druhého souboru. To znamená, že pokud přidělení potrvá, všechny soubory ve skupině souborů skončí s podobným procentem využitého místa.

Další informace najdete v tématu Strategie vyplnění souboru a skupiny souborů.

Stránky PFS

Stránky s volným místem stránky (PFS) zaznamenávají stav přidělení každé stránky a množství volného místa na každé stránce. Stránka PFS má pro každou stránku, kterou sleduje, 1 bajt. Bajt zaznamenává, jestli je stránka přidělená, a pokud ano, jestli je prázdná, 1 až 50 % plná, 51 až 80 % plná, 81 až 95 % plná, nebo 96 až 100 procent zaplněná.

Po přidělení rozsahu objektu použije databázový stroj stránky PFS ke sledování, které stránky v rozsahu mají data nebo jsou zdarma. Tyto informace se použijí, když databázový stroj přidělí novou stránku. Množství volného místa na stránce je zachováno pouze pro heap a textové/LOB stránky. Tyto informace se používají, když databázový stroj musí najít stránku s dostatečným volným místem pro uložení nově vloženého řádku.

Indexy BTree nevyžadují sledování volného místa stránky, protože bod, na který se má vložit nový řádek, je vždy určen hodnotami klíče indexu. Pokud stránka v indexu BTree nemá dostatek volného místa, přidá se nová stránka a přibližně polovina původních dat stránky se přesune na novou stránku.

Intervaly GAM a PFS

Nová stránka PFS, GAM nebo SGAM se přidá do datového souboru pro každý nově přidaný rozsah, který sleduje.

Za první stránkou PFS je nová stránka PFS o 8 088 stránek dále, a další stránky PFS následují v intervalech po 8 088 stránkách. V datovém souboru je ID stránky 1 stránka PFS, ID stránky 8088 je stránka PFS, ID stránky 16176 je stránka PFS atd.

Podobně existuje dvojice stránek GAM a SGAM, která začíná stránkami 2 a 3 a opakuje se pro každý interval GAM přibližně každých 64 000 oblastí nebo 4 GiB.

Následující diagram znázorňuje první výskyt stránek PFS, GAM a SGAM na začátku datového souboru za stránkou záhlaví souboru. S růstem souboru se v příslušných intervalech zobrazí nové stránky PFS, GAM a SGAM.

Diagram znázorňující posloupnost stránek pro správu rozsahů

Stránky IAM

Stránka Mapa přidělování indexů (IAM) mapuje rozsahy používané jednotkou přidělení v intervalu GAM. Jednotka přidělení je přidružená k oddílu haldy nebo indexu a může být jedním ze tří typů:

  • IN_ROW_DATA

    Obsahuje ne-LOB datové stránky nebo části LOB dat, které se mohou vejít do řádku.

  • ÚdajeLOB

    Obsahuje datové stránky LOB používané datovými typy, jako jsou varchar(max), nvarchar(max), varbinary(max), xml a json.

  • ROW_OVERFLOW_DATA

    Obsahuje datové stránky LOB používané datovými typy proměnných délky, jako jsou varchar, nvarchar, varbinary nebo sql_variant , pokud data překročí limit velikosti řádku o velikosti 8 060 bajtů.

Každý oddíl haldy nebo indexu vždy obsahuje alespoň jednu IN_ROW_DATA alokační jednotku. Může také obsahovat LOB_DATA a ROW_OVERFLOW_DATA alokační jednotky v závislosti na datových typech a velikostech řádků v oddílu.

Podobně jako na stránce GAM nebo SGAM se stránka IAM věnuje intervalu 4 GiB v souboru. Pokud jednotka přidělení obsahuje rozsahy z více než jednoho souboru, nebo pokud obsahuje více než jeden 4-GiB interval souboru, propojí se více stránek IAM v řetězu IAM. Každá jednotka přidělení má tedy alespoň jednu stránku IAM pro každý soubor, v němž má rozsahy. V souboru může být také více než jedna stránka IAM, pokud rozsahy přidělené k alokační jednotce v souboru překročí rozsah, který může zaznamenat jedna stránka IAM. Stránka IAM v souboru může sledovat rozsahy v daném souboru a v jakémkoli jiném souboru stejné databáze.

Diagram znázorňující distribuci stránek IAM

Na rozdíl od stránek PFS, GAM a SGAM, které se opakují v pevných intervalech, se stránky IAM přidělují podle potřeby pro každou alokační jednotku. Zobrazení sys.system_internals_allocation_units systému odkazuje na první stránku IAM pro alokační jednotku. Všechny stránky IAM pro danou alokační jednotku jsou propojené v řetězci IAM.

Důležité

Systémové sys.system_internals_allocation_units zobrazení není podporované a může se změnit. Kompatibilita není zaručená. Toto zobrazení není dostupné ve službě Azure SQL Database.

Diagram znázorňující stránky IAM propojené v řetězci pro každou jednotku přidělení.

Stránka IAM obsahuje záhlaví, které označuje počáteční rozsah rozsahů mapovaných danou stránkou. Stránka IAM má také rastrový obrázek, ve kterém každý bit představuje jeden rozsah. První bit v mapě představuje první rozsah v rozsahu, druhý bit představuje druhý rozsah atd. Pokud je 0bit, představovaný rozsah není přidělen k alokační jednotce, která vlastní stránku IAM. Pokud je bit 1, rozsah, který tento bit představuje, je přidělen alokační jednotce vlastnící stránku IAM.

Pokud databázový stroj musí vložit nový řádek a na aktuální stránce není k dispozici žádné místo, použije stránky IAM a PFS k vyhledání stránky pro přidělení řádku. U haldových nebo textových/LOB stránek podobně používá stránky IAM a PFS k vyhledání stránky s dostatečným místem pro ukládání řádku. Databázový stroj používá stránky IAM k vyhledání rozsahů přidělených k alokační jednotce. V každém rozsahu prohledá stránky PFS a zjistí, jestli je stránka, která se dá použít.

U indexů BTree je kurzor nového řádku určen klíčem indexu, ale když je potřeba nová stránka, dojde k dříve popsanému procesu.

Databázový stroj přidělí nový rozsah alokační jednotce, když nemůže rychle najít stránku v existujícím rozsahu s dostatečným místem na vložení řádku.

Stránky DCM a BCM

Databázový stroj používá dva typy systémových stránek ke sledování rozsahů upravených od poslední úplné zálohy a rozsahů upravených operacemi hromadného kopírování.

Stránky DCM (Differential Changed Map) urychlují rozdílové zálohování. Hromadná změnová mapa (BCM) urychlí operace hromadného kopírování, když databáze používá model obnovení s hromadným protokolováním. Podobně jako stránky GAM a SGAM jsou tyto struktury rastrové obrázky, ve kterých každý bit představuje jeden rozsah.

  • Stránky DCM

    Tyto stránky sledují rozsahy, které se od posledního úplného zálohování databáze změnily. Pokud je bit pro rozsah 1, rozsah byl změněn. Pokud je 0bit , rozsah nebyl změněn.

    Rozdílové zálohy čtou stránky DCM a určují, v jakém rozsahu byly změněny. Tím se sníží počet stránek, které musí diferenciální záloha číst a zapisovat. Doba trvání rozdílového zálohování je úměrná počtu změněných rozsahů od posledního úplného zálohování databáze, nikoli celkové velikosti databáze.

  • Stránky BCM

    Tyto stránky sledují rozsahy, které byly změněny hromadně protokolovanými operacemi od poslední zálohy transakčního protokolu. Pokud je bit pro rozsah 1, rozsah byl změněn. Pokud je 0bit , rozsah nebyl změněn.

    I když se stránky BCM zobrazují ve všech databázích, jsou relevantní pouze v případě, že databáze používá model hromadného protokolování. Když se v tomto modelu obnovení provede zálohování transakčního protokolu, proces zálohování prohledá stránky BCM z hlediska rozsahů, které byly změněny. Zahrnuje tyto rozsahy v zálohování protokolů pro umožnění obnovení v případě obnovení databáze ze zálohy databáze a sekvence záloh transakčních protokolů.

    Stránky BCM nejsou relevantní v databázi, která používá jednoduchý model obnovení, protože nejsou plně protokolovány žádné hromadně protokolované operace. Nejsou také relevantní v databázi, která používá úplný model obnovení, protože tento model obnovení zpracovává hromadně protokolované operace jako plně protokolované operace.

Stránky DCM a BCM jsou ukládány ve stejných intervalech GAM, které mají přibližně 4 GiB, stejně jako stránky GAM a SGAM. Stránky DCM a BCM následují stránky GAM a SGAM v rámci fyzického souboru v tomto pořadí.

Diagram znázorňující rozdělení intervalu speciálních stránek