sql >> Database >  >> RDS >> Sqlserver

SQL Server Maximale rijgrootte versus Varchar (Max) grootte

In Microsoft SQL Server worden gegevens (inclusief indexen) opgeslagen in een of meer 8k (8192 bytes) "pagina's". Er zijn verschillende soorten pagina's die kunnen worden gebruikt om verschillende situaties aan te pakken (bijv. Data, LOB, Index, AllocationMap, enz.). Elke pagina heeft een koptekst met metagegevens over die pagina en wat deze bevat.

De meeste gegevens worden in de rij zelf opgeslagen en een of meer van deze rijen worden op hun beurt opgeslagen op een pagina voor "in-row data". Vanwege de ruimte die de rijkop inneemt, is de grootste die een rij kan zijn (voor gegevens in de rij) 8060 bytes.

Niet alle gegevens worden echter in de rij opgeslagen. Voor bepaalde gegevenstypes kunnen de gegevens daadwerkelijk worden opgeslagen op een "LOB-gegevens"-pagina terwijl een aanwijzer in de "in-rij" gegevens wordt gelaten:

  • Verouderde / verouderde LOB-typen die niemand meer zou moeten gebruiken (TEXT , NTEXT , en IMAGE ), slaan hun gegevens standaard altijd op LOB-pagina's op en gebruiken altijd een 16-byte-aanwijzer naar die LOB-pagina.

  • De nieuwere LOB-typen (VARCHAR(MAX) , NVARCHAR(MAX) , VARBINARY(MAX) , en XML ), zal standaard proberen de gegevens rechtstreeks in de rij te passen als dit past. Anders worden de gegevens op LOB-pagina's opgeslagen en wordt een aanwijzer van 24-72 bytes gebruikt (afhankelijk van de grootte van de LOB-gegevens).

Zo zou je tot 78 GB + 4 bytes kunnen opslaan (vergeet de INT niet Primaire sleutel;-) in een enkele rij:de maximale rijgrootte ligt tussen 940 bytes ((39 * 24) + 4) en 2812 bytes ((39 * 72) + 4). Maar nogmaals, dat is slechts het maximale bereik; als de gegevens in elk van de 39 VARCHAR(MAX) velden is slechts 10 bytes, dan worden alle gegevens in de rij opgeslagen en is de rijgrootte 394 bytes ((39 * 10) + 4).

Aangezien u zoveel velden met variabele lengte hebt (of ze nu MAX zijn of niet), is de enige manier om de grootte van toekomstige rijen te schatten, een goed idee te hebben van welke gegevens u in deze tabel opslaat. Hoewel een tabel met alle, of zelfs de meeste, MAX-datatypes impliceert dat niemand echt enig idee heeft wat er in deze tabel zal worden opgeslagen.

In die zin moet erop worden gewezen dat dit een afschuwelijk gemodelleerde tabel is / vreselijk gebruik van MAX-gegevenstypevelden, en moet worden aangepast.

Zie mijn antwoord op de volgende DBA.StackExchange-vraag voor meer informatie over hoe gegevenspagina's zijn gestructureerd:

SUM van DATALENGTH's komt niet overeen met tabelgrootte van sys.allocation_units



  1. MySQL-query om te zoeken naar items met bepaalde tags

  2. MYSQL, Max, Groeperen op en Max

  3. hoe cascade te gebruiken in orakel

  4. herlaad de pagina met ajax om een ​​livechat te maken