sql >> Database teknologi >  >> RDS >> Sqlserver

Maksimal størrelse af en varchar(max) variabel

Så vidt jeg kan se er der ingen øvre grænse i 2008.

I SQL Server 2005 mislykkes koden i dit spørgsmål i tildelingen til @GGMMsg variabel med

Forsøg på at vokse LOB ud over den maksimalt tilladte størrelse på 2.147.483.647 bytes.

koden nedenfor fejler med

REPLICATE:Længden af ​​resultatet overskrider længdegrænsen (2 GB) for den store måltype.

Det ser dog ud til, at disse begrænsninger stille og roligt er blevet ophævet. I 2008

DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681); 

SET @y = REPLICATE(@y,92681);

SELECT LEN(@y) 

Returnerer

8589767761

Jeg kørte dette på min 32 bit desktop maskine, så denne 8GB streng er langt over adresserbar hukommelse

Kører

select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid

Returneret

internal_objects_alloc_page_co 
------------------------------ 
2144456    

så jeg formoder, at det hele bare bliver gemt i LOB sider i tempdb uden validering af længde. Væksten i sideantal var alt forbundet med SET @y = REPLICATE(@y,92681); udmelding. Den indledende variabeltildeling til @y og LEN beregning øgede ikke dette.

Grunden til at nævne dette er fordi sideantallet er enormt mere, end jeg havde forventet. Hvis man antager en 8KB side, så fungerer dette på 16,36 GB, hvilket åbenbart er mere eller mindre det dobbelte af, hvad der ser ud til at være nødvendigt. Jeg spekulerer i, at dette sandsynligvis skyldes ineffektiviteten af ​​strengsammenkædningsoperationen, der skal kopiere hele den enorme streng og tilføje en del til enden i stedet for at kunne tilføje til enden af ​​den eksisterende streng. Desværre i øjeblikket er .WRITE metoden er ikke understøttet for varchar(max) variabler.

Tilføjelse

Jeg har også testet adfærden med at sammenkæde nvarchar(max) + nvarchar(max) og nvarchar(max) + varchar(max) . Begge disse gør det muligt at overskride grænsen på 2 GB. Forsøg på derefter at gemme resultaterne af dette i en tabel mislykkes dog med fejlmeddelelsen Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes. en gang til. Scriptet til det er nedenfor (det kan tage lang tid at køre).

DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647); 
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1)  /*4294967294, 4294967292*/


DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823); 
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)  /*2147483646, 4294967292*/


DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)   /*6442450940, 12884901880*/

/*This attempt fails*/
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test


  1. Sammenligning af Galera Cluster Cloud-tilbud:Del 1 Amazon AWS

  2. MariaDB &Eksterne Data

  3. SQLite JSON_TREE()

  4. postgresql databaseejer kan ikke få adgang til databasen - Ingen relationer fundet.