O ile mogę powiedzieć, nie istnieje górna granica w 2008
w SQL Server 2005 kod w swoim pytaniu nie działa na przypisanie do zmiennej @GGMMsg
z
Próba wzrost LOB poza maksymalnym dozwolonym rozmiarem 2 147 483 647 bajtów. Poniżej
kod nie z
replikacji: Długość wynik przekracza limitu długości (2 GB) z cel dużą czcionką.
Jednak wydaje się, że ograniczenia te zostały po cichu zniesione.Na 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Zwraca
8589767761
wpadłem to na moim 32-bitowym komputerze stacjonarnym więc ciąg 8GB jest sposób, w nadmiarze adresowalnych pamięci
Running
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
powrócił
internal_objects_alloc_page_co
------------------------------
2144456
Zakładam więc, że to wszystko zostanie zapisane na LOB
stronach w tempdb
bez sprawdzania poprawności długości. Wzrost liczby stron był powiązany z instrukcją SET @y = REPLICATE(@y,92681);
. Początkowe przypisanie zmiennych do @y
i obliczenie LEN
nie zwiększyło tego.
Powodem tego jest fakt, że liczba stron jest znacznie większa, niż się spodziewałem. Zakładając stronę o wielkości 8 KB, daje to wynik 16,36 GB, co jest oczywiście mniej więcej podwójne, co wydaje się konieczne. Spekuluję, że jest to prawdopodobnie spowodowane nieefektywnością operacji łączenia ciągów, która wymaga skopiowania całego ogromnego ciągu i dołączenia fragmentu do końca, zamiast dodawać go do końca istniejącego łańcucha. Niestety w tej chwili metoda .WRITE
dla zmiennych varchar (max).
Dodawanie
Ja również testowane zachowanie z złączenie nvarchar(max) + nvarchar(max)
i nvarchar(max) + varchar(max)
. Oba pozwalają na przekroczenie limitu 2 GB. Próba następnie zapisania wyników tego w tabeli kończy się niepowodzeniem, ale ponownie pojawia się komunikat o błędzie Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
. Skrypt do tego jest poniżej (może zająć dużo czasu).
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
'declare @x varchar (max) = 'XX'; SELECT LEN (REPLICATE (@ x, 2147483647)) 'daje' 4294967294', ale długo trwa, nawet po powrocie 'SELECT', więc nie jestem pewien, co robi ten dodatkowy czas. –