V Microsoft SQL Server jsou data (která zahrnují indexy) uložena na jedné nebo více 8k (8192 bajtech) "stránkách". Existují různé typy stránek, které lze použít k řešení různých situací (např. Data, LOB, Index, AllocationMap atd.). Každá stránka má záhlaví, které obsahuje metadata o této stránce a o tom, co obsahuje.
Většina dat je uložena v samotném řádku a jeden nebo více těchto řádků je zase uloženo na stránce pro „data v řádku“. Vzhledem k prostoru, který zabírá záhlaví řádku, je největší řádek, který může být (pro data „v řádku“), 8060 bajtů.
Ne všechna data jsou však uložena v řádku. U určitých datových typů mohou být data ve skutečnosti uložena na stránce "LOB data", zatímco v "in-row" datech je ponechán ukazatel:
-
Starší / zastaralé typy LOB, které by již nikdo neměl používat (
TEXT
,NTEXT
aIMAGE
), ve výchozím nastavení vždy ukládají svá data na stránky LOB a vždy používají 16bajtový ukazatel na tuto stránku LOB. -
Novější typy LOB (
VARCHAR(MAX)
,NVARCHAR(MAX)
,VARBINARY(MAX)
aXML
), ve výchozím nastavení se pokusí umístit data přímo do řádku, pokud se vejdou. Jinak ukládá data na stránky LOB a používá ukazatel 24 - 72 bajtů (v závislosti na velikosti dat LOB).
Takto můžete uložit až 78 GB + 4 bajty (nezapomeňte na INT
Primární klíč;-) v jednom řádku:maximální velikost řádku bude mezi 940 bajty ((39 * 24) + 4) a 2812 bajty ((39 * 72) + 4). Ale opět je to jen maximální dosah; pokud jsou data v každém z 39 VARCHAR(MAX)
pole je pouze 10 bajtů, pak budou všechna data uložena v řádku a velikost řádku bude 394 bajtů ((39 * 10) + 4).
Vzhledem k tomu, že máte tolik polí s proměnnou délkou (ať už jsou MAX nebo ne), jediným způsobem, jak odhadnout velikost budoucích řádků, je mít dobrou představu o tom, jaká data budete v této tabulce ukládat. Ačkoli tabulka se všemi, nebo dokonce většinou, MAX datovými typy naznačuje, že nikdo ve skutečnosti netuší, co bude v této tabulce uloženo.
V této souvislosti je třeba zdůraznit, že se jedná o příšerně modelovanou tabulku / příšerné použití polí datových typů MAX a mělo by být refaktorováno.
Další podrobnosti o tom, jak jsou datové stránky strukturovány, naleznete v mé odpovědi na následující otázku DBA.StackExchange:
SUM DATALENGTH neodpovídá velikosti tabulky ze sys.allocation_units