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

SQL Server Maximální velikost řádku versus velikost Varchar (Max).

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 a IMAGE ), 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) a XML ), 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



  1. .MySQLNonTransientConnectionException:Nelze vytvořit připojení k databázovému serveru

  2. Duplikovat řádky v tabulce primárního klíče.

  3. Primární klíče a indexy v dotazovacím jazyce Hive jsou možné nebo ne?

  4. Vytvoření spouštěče pro vložení podřízené tabulky vrátí matoucí chybu