Sdílet prostřednictvím


Průvodce architekturou stránek a rozsahů

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

Tato stránka je základní jednotkou úložiště dat v SQL Serveru. Rozsah je kolekce osmi fyzicky souvislých stránek. Rozsahy pomáhají efektivně spravovat stránky. Tato příručka popisuje datové struktury, které se používají ke správě stránek a rozsahů ve všech verzích SQL Serveru. Pochopení architektury stránek a rozsahů je důležité pro navrhování a vývoj databází, které efektivně fungují.

Stránky a rozsahy

Základní jednotkou úložiště dat v SQL Serveru je stránka. 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 se provádějí na úrovni stránky. To znamená, že SQL Server čte nebo zapisuje celé datové stránky.

Rozsahy jsou kolekce osmi fyzicky souvislých stránek a slouží k efektivní správě stránek. Všechny stránky jsou uspořádané do rozsahů.

Stránky

V běžné knize je veškerý obsah napsán na stránkách. Podobně jako v knize SQL Server zapíše všechny řádky dat na stránkách a všechny datové stránky mají stejnou velikost: 8 kB. Většina stránek v knize obsahuje data – hlavní obsah knihy – a některé stránky obsahují metadata o obsahu (například obsah a index). Sql Server není jiný: většina stránek obsahuje skutečné řádky dat, které uživatelé uložili; označují se jako datové stránky a stránky textu/obrázku (pro zvláštní případy). Indexové stránky obsahují odkazy na index o tom, kde jsou data. Nakonec existují systémové stránky , které ukládají různá metadata o organizaci dat.

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, množství volného místa na stránce a ID alokační jednotky objektu, který stránku vlastní.

Následující tabulka uvádí typy stránek používané v datových souborech databáze SQL Serveru.

Typ stránky Obsah
Data Řádky dat se všemi daty kromě textu, ntextu, obrázku, nvarchar(max), varchar(max), varbinary(max) a dat XML, pokud je text v řádku nastavený na .ON
Index Položky rejstříku.
Text/obrázek Datové typy velkých objektů: text, ntext, obrázek, nvarchar(max), varchar(max), varbinary(max) a data XML .

Sloupce s proměnlivou délkou, pokud datový řádek přesahuje 8 kB: varchar, nvarchar, varbinary a sql_variant.
Mapa globálního přidělení (GAM)

Mapa sdíleného globálního přidělení (SGAM)
Informace o tom, zda jsou rozsahy přiděleny.
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 tabulkou nebo indexem na jednotku přidělení
Hromadné změny mapy (BCM) Informace o rozsahech upravených hromadnými operacemi od posledního BACKUP LOG příkazu na jednotku přidělení
Rozdílové změněné mapování (DCM) Informace o rozsahech, které se změnily od posledního BACKUP DATABASE příkazu na jednotku přidělení.

Poznámka:

Soubory protokolu neobsahují stránky. Obsahují řadu záznamů protokolu, které nemají pevnou velikost.

Datové řádky jsou uloženy na stránce sériově, počínaje bezprostředně za záhlavím. Tabulka posunu řádku začíná na konci stránky a každá tabulka posunu řádku obsahuje jednu položku pro každý řádek na stránce. Každá položka posunu řádku ukládá, jak daleko je první bajt řádku od začátku stránky. Funkce tabulky posunu řádku tedy pomáhá SYSTÉMU SQL Server rychle najít řádky na stránce. Položky v tabulce posunu řádku jsou v obráceném pořadí od posloupnosti řádků na stránce.

Diagram datové stránky SQL Serveru

Podpora velkých řádků

Řádky nemohou přesahovat stránky; Části řádku se ale dají přesunout mimo stránku řádku, takže řádek může být velmi velký. Maximální množství dat a režijních nákladů obsažených v jednom řádku na stránce je 8 060 bajtů. Nezahrnuje data uložená v typu stránky textu nebo obrázku.

Toto omezení je uvolněné pro tabulky, které obsahují varchar, nvarchar, varbinary nebo sql_variant sloupce. Pokud celková velikost řádků všech pevných a proměnných sloupců v tabulce překročí omezení 8 060 bajtů, SQL Server dynamicky přesune jeden nebo více sloupců s proměnlivou délkou na stránky v jednotce přidělení ROW_OVERFLOW_DATA počínaje sloupcem s největší šířkou.

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, SQL Server dynamicky přesune sloupce zpět na původní datovou stránku.

Důležité informace o přetečení řádků

Řádek se nemůže nacházet na více stránkách a může přetékat, pokud kombinovaná velikost polí datového typu s proměnlivou délkou překročí limit 8060 bajtů. Pro ilustraci lze vytvořit tabulku se dvěma sloupci: jedním varchar(7000) a jiným varcharem (2000). Jednotlivě ani jeden sloupec nepřekračuje 8060 bajtů, ale v kombinaci by to mohlo udělat, pokud je vyplněna celá šířka každého sloupce. SQL Server může dynamicky přesouvat sloupec délky proměnné varchar(7000) na stránky v ROW_OVERFLOW_DATA alokační jednotce. Při kombinování sloupců typu varchar, nvarchar, varbinary nebo sql_variant nebo CLR definovaných uživatelem, které překračují 8 060 bajtů na řádek, zvažte následující:

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

    Dotazování a provádění dalších výběrových operací, jako jsou řazení nebo spojení u velkých záznamů, které obsahují data přetečení řádků, zpomaluje zpracování času, protože tyto záznamy se zpracovávají synchronně místo asynchronně.

    Proto při návrhu tabulky s více varchar, nvarchar, varbinary nebo 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. Pokud pravděpodobně dochází k častým dotazům na mnoho řádků dat přetečení řádků, zvažte normalizaci tabulky tak, aby se některé sloupce přesunuly do jiné tabulky. To se pak dá dotazovat v asynchronní JOIN operaci.

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

  • Součet dalších sloupců datového typu, včetně dat typu char a nchar , musí spadat do limitu 8 060 bajtů řádku. Data velkých objektů jsou také vyloučena z limitu 8 060 bajtů řádků.

  • Klíč indexu clusterovaného indexu nemůže obsahovat sloupce varchar , které mají existující data v jednotce přidělení ROW_OVERFLOW_DATA. Pokud je clusterovaný index vytvořen ve sloupci varchar a existující data jsou v IN_ROW_DATA alokační jednotce, následné vložení nebo aktualizace akcí ve sloupci, které by odeslaly data mimo řádek, selžou. Další informace o alokačních jednotkách najdete v průvodci návrhem a architekturou indexu SQL SQL a SQL.

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

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

  • 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.

Rozsahy

Rozsahy jsou základní jednotkou, ve které se spravuje prostor. Rozsah je osm fyzicky souvislých stránek nebo 64 kB. To znamená, že databáze SQL Serveru mají 16 rozsahů na megabajt.

SQL Server má dva typy rozsahů:

  • Jednotné rozsahy vlastní jeden objekt; všech osm stránek v rozsahu může používat pouze vlastnící objekt.
  • Smíšené rozsahy sdílí až osm objektů. Každý z osmi stránek v rozsahu může vlastnit jiný objekt.

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

Databázový stroj až do sql Serveru 2014 (12.x) nepřiděluje celé rozsahy tabulkám s malými objemy dat. Nová tabulka nebo index obvykle přiděluje stránky ze smíšených rozsahů. Když se tabulka nebo index zvětšují na bod, na který je osm stránek, přepne se pro následné přidělení jednotné rozsahy. 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) je výchozí hodnota pro většinu přidělení v uživatelské databázi a tempdb má používat jednotné rozsahy s výjimkou přidělení patřících do prvních osmi stránek řetězu IAM. Přidělení pro master, msdba model databáze stále zachovat předchozí chování.

Poznámka:

V SQL Serveru, až a včetně SQL Serveru 2014 (12.x), můžete použít příznak trasování (TF) 1118 ke změně výchozího přidělení tak, aby vždy používal jednotné rozsahy. Další informace o tomto příznaku trasování naleznete v části příznak trasování 1118.

Počínaje SQL Serverem 2016 (13.x) se funkce poskytované TF 1118 automaticky povolí pro tempdb všechny uživatelské databáze. U uživatelských databází je toto chování řízeno SET MIXED_PAGE_ALLOCATION možností ALTER DATABASE, s výchozí hodnotou nastavenou na OFFa TF 1118 nemá žádný vliv. 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é

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

Počínaje SQL Serverem 2019 (15.x) je funkce systému sys.dm_db_page_info dostupná a vrací informace o stránce v databázi. Funkce vrátí jeden řádek, který obsahuje informace záhlaví ze stránky, včetně object_id, index_ida partition_id. Tato funkce nahrazuje potřebu používat DBCC PAGE ve většině případů.

Správa přidělování rozsahů a volného místa

Datové struktury SQL Serveru, které spravují přidělování rozsahů a sledují volné místo, mají relativně jednoduchou strukturu. To má následující výhody:

  • Informace o volném prostoru jsou hustě zabalené, takže tyto informace obsahují relativně málo stránek.

    Tím se zvýší rychlost snížením počtu čtení disků, které jsou potřeba k načtení informací o přidělení. Tím se také zvyšuje pravděpodobnost, že stránky přidělení zůstanou v paměti a nebudou vyžadovat více čtení.

  • Většina informací o přidělení není zřetězený dohromady. To zjednodušuje údržbu informací o přidělení.

    Každé přidělení nebo zrušení přidělení stránky je možné provést rychle. Tím se zmenší kolize mezi souběžnými úlohami, které musí přidělovat nebo uvolnit stránky.

Správa přidělování rozsahů

SQL Server používá dva typy map přidělení k zaznamenání přidělení rozsahů:

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

    Stránky GAM zaznamenávají, jaké rozsahy byly přiděleny. Každý GAM pokrývá 64 000 rozsahů nebo téměř 4 gigabajty (GB) dat. Gam má 1 bit pro každý rozsah v intervalu, který pokrývá. Pokud je bit , rozsah je 1volný; pokud je 0bit , je přidělen rozsah.

  • 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ý SGAM pokrývá 64 000 rozsahů nebo téměř 4 GB dat. SGAM má 1 bit pro každý rozsah v intervalu, který pokrývá. Pokud je 1bit , rozsah se používá jako smíšený rozsah a má bezplatnou stránku. Pokud je 0bit , rozsah se nepoužívá jako smíšený rozsah nebo je smíšený a všechny jeho stránky se používají.

Každý rozsah má následující bitové vzory nastavené v 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

To způsobuje jednoduché algoritmy správy rozsahu.

  • Pokud chcete přidělit jednotný rozsah, databázový stroj vyhledá gam bit 1 a nastaví ho na 0.
  • Pokud chcete najít smíšený rozsah s volnými stránkami, databázový stroj hledá 1 trochu SGAM.
  • Pokud chcete přidělit smíšený rozsah, databázový stroj vyhledá gam bit 1 , nastaví ho na 0a pak také nastaví odpovídající bit v SGAM na 1.
  • Aby bylo možné uvolnit rozsah, databázový stroj zajistí, že bit GAM je nastaven na 1a bit SGAM je nastaven na 0.

Algoritmy používané interně databázovým strojem jsou propracovanější, než co je popsáno v tomto článku, protože databázový stroj distribuuje data rovnoměrně v databázi. Dokonce i skutečné algoritmy jsou zjednodušené tím, že nemusí spravovat řetězy informací o přidělování rozsahu.

Sledování volného místa

Stránky volného místa stránky (PFS) zaznamenávají stav přidělení každé stránky, zda byla přidělena jednotlivá stránka, a množství volného místa na každé stránce. PfS má pro každou stránku 1 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 k zaznamenání, které stránky v rozsahu jsou přiděleny nebo volné. Tyto informace se používají, když databázový stroj musí přidělit novou stránku. Velikost volného místa na stránce je zachována pouze pro haldu a stránky textu/obrázku. Používá se, když databázový stroj musí najít stránku s volným místem dostupným pro uložení nově vloženého řádku. Indexy nevyžadují sledování volného místa na stránce, protože bod, na který chcete vložit nový řádek, je nastaven hodnotami klíče indexu.

Do datového souboru se přidá nová stránka PFS, GAM nebo SGAM pro každou další oblast, o které sleduje. Za první stránkou PFS je tedy nová stránka PFS 8 088 a další stránky PFS v následujících 8 088 intervalech stránek. Pro ilustraci 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.

Po první stránce GAM je nová stránka GAM 64 000 a sleduje 64 000 rozsahů, které následují; sekvence pokračuje v 64 000 intervalech. Podobně existuje nová stránka SGAM 64 000 rozsahů za první stránkou SGAM a další stránky SGAM v následujících 64 000 intervalech rozsahu.

Následující obrázek znázorňuje posloupnost stránek používaných databázovým strojem k přidělování a správě rozsahů.

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

Správa místa používaného objekty

Stránka Mapa přidělení indexu (IAM) mapuje rozsahy v 4GB části souboru databáze, který používá alokační jednotka. Alokační jednotka je jedním ze tří typů:

  • IN_ROW_DATA

    Obsahuje oddíl haldy nebo indexu.

  • LOB_DATA

    Obsahuje velké datové typy objektů (LOB), například xml, varbinary(max) a varchar(max).

  • ROW_OVERFLOW_DATA

    Uchovává data o délce proměnných uložených ve sloupcích varchar, nvarchar, varbinary nebo sql_variant , které překračují limit velikosti řádků 8 060 bajtů.

Každý oddíl haldy nebo indexu obsahuje alespoň IN_ROW_DATA alokační jednotku. Může také obsahovat LOB_DATA nebo ROW_OVERFLOW_DATA alokační jednotku v závislosti na haldě nebo schématu indexu.

Stránka IAM pokrývá rozsah 4 GB v souboru a je stejné pokrytí jako GAM nebo SGAM stránka. Pokud jednotka přidělení obsahuje rozsahy z více než jednoho souboru nebo více než jednoho 4GB rozsahu souboru, bude v řetězu IAM propojeno více stránek IAM. Každá jednotka přidělení má tedy alespoň jednu stránku IAM pro každý soubor, na kterém má rozsahy. V souboru může být také více než jedna stránka IAM, pokud rozsah rozsahů souboru přidělených k alokační jednotce překračuje rozsah, který může zaznamenat jedna stránka IAM.

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

Stránky IAM se přidělují podle potřeby pro každou alokační jednotku a nacházejí se náhodně v souboru. 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í je určené jenom pro interní použití 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 na jednotku přidělení

Stránka IAM obsahuje záhlaví, které označuje počáteční rozsah rozsahů mapovaných stránkou IAM. Stránka IAM má také velký 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 , rozsah, který představuje, není přidělen k alokační jednotce, která vlastní IAM. Pokud je 1bit , rozsah, který představuje, je přidělen k alokační jednotce, která vlastní 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, která se má přidělit, nebo pro haldu nebo stránku s textem nebo obrázkem, stránku s dostatečným místem pro uložení řá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 databázový stroj prohledá stránky PFS a zjistí, jestli je stránka, která se dá použít. Každá stránka IAM a PFS pokrývá mnoho datových stránek, takže v databázi je několik stránek IAM a PFS. To znamená, že stránky IAM a PFS jsou obecně v paměti ve fondu vyrovnávací paměti SQL Serveru, takže je můžete rychle prohledávat. U indexů je kurzor nového řádku nastaven 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ému rozsahu k alokační jednotce pouze tehdy, když nemůže rychle najít stránku v existujícím rozsahu s dostatečným místem pro vložení řádku.

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

Databázový stroj přiděluje rozsahy z rozsahů dostupných ve skupině souborů pomocí algoritmu proporcionálního přidělování výplně . Ve stejné skupině souborů se dvěma soubory platí, že pokud jeden soubor obsahuje dvojité volné místo jako druhý, přidělí se ze souboru dvě stránky s dostupným místem pro každou stránku přidělenou z druhého souboru. To znamená, že každý soubor ve skupině souborů by měl mít podobné procento využitého místa.

Sledování upravených rozsahů

SQL Server používá ke sledování rozsahů upravených operacemi hromadného kopírování dvě interní datové struktury a rozsahy upravené od poslední úplné zálohy. Tyto datové struktury výrazně urychlují rozdílové zálohování. Také urychlují protokolování operací hromadného kopírování, když databáze používá model hromadného protokolování obnovení. Podobně jako stránky GAM a SGAM jsou tyto struktury rastrové obrázky, ve kterých každý bit představuje jeden rozsah.

  • Rozdílové změněné mapování (DCM)

    Sleduje rozsahy, které se od posledního BACKUP DATABASE příkazu změnily. Pokud je 1bit pro rozsah , rozsah byl změněn od posledního BACKUP DATABASE příkazu. Pokud je 0bit , rozsah nebyl změněn.

    Rozdílové zálohy čtou jenom stránky DCM a určují, v jakém rozsahu byly změněny. Tím se výrazně sníží počet stránek, které musí rozdílové zálohování kontrolovat. Doba, po kterou se spouští rozdílové zálohování, je úměrná počtu upravených rozsahů od posledního BACKUP DATABASE příkazu, nikoli celkové velikosti databáze.

  • Hromadné změny mapy (BCM)

    Sleduje rozsahy, které byly změněny hromadně protokolovanými operacemi od posledního BACKUP LOG příkazu. Pokud je 1bit pro rozsah , rozsah byl změněn hromadně protokolovanou operací po posledním BACKUP LOG příkazu. Pokud je 0bit , rozsah nebyl upraven hromadně protokolovanými operacemi.

    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í obnovení. V tomto modelu BACKUP LOG obnovení při provedení procesu zálohování prohledává bcM rozsahy, které byly změněny. Tyto rozsahy pak zahrne do zálohy protokolu. Tím dojde k obnovení hromadně protokolovaných operací, pokud je databáze obnovena ze zálohy databáze a posloupnost záloh transakčních protokolů. Stránky BCM nejsou relevantní v databázi, která používá jednoduchý model obnovení, protože nejsou protokolovány žádné hromadně protokolované operace. Nejsou relevantní v databázi, která používá úplný model obnovení, protože tento model obnovení zpracovává hromadně protokolované operace jako plně protokolované operace.

Interval mezi stránkami DCM a stránkami BCM je stejný jako interval mezi gam a stránkou SGAM, 64 000 rozsahů. Stránky DCM a BCM se nacházejí za stránkami GAM a SGAM ve fyzickém souboru následujícím způsobem:

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