지금까지 내가 SQL 서버 질문의 코드가
는 시도로 @GGMMsg
변수에 할당 실패 2005 년에서 2008 년
의 상한이 없다 말할 수있는 최대 허용 크기 인 2,147,483,647 바이트를 초과하여 LOB를 늘릴 수 있습니다.
아래 코드
REPLICATE 함께 실패 결과의 길이는 타겟 큰 종류의 길이 제한 (2GB)을 초과한다.
그러나 이러한 제한 사항은 조용히 해제 된 것처럼 보입니다.2008 년
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
반환 내 32 비트 데스크탑 컴퓨터에서이 작업을 실행
8589767761
그래서이 8 기가 바이트 문자열
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
반환을 실행 주소 지정 가능 메모리
를 초과하는 방법입니다
internal_objects_alloc_page_co
------------------------------
2144456
그래서이 모든 내용은 길이가 유효하지 않은 tempdb
의 LOB
페이지에 저장되어 있다고 가정합니다. 페이지 수 증가율은 모두 SET @y = REPLICATE(@y,92681);
성명과 관련이 있습니다. @y
및 LEN
으로 초기 변수를 지정해도 증가하지 않았습니다.
이유는 페이지 수가 예상했던 것보다 훨씬 많기 때문입니다. 8KB 페이지를 가정하면 16.36GB에서 작동하며 이는 분명히 필요한 것보다 더 많거나 적은 두 배입니다. 나는 이것이 거대한 문자열 전체를 복사해야하고 기존 문자열의 끝 부분에 추가 할 수있는 것보다 끝 부분에 청크를 추가해야하는 문자열 연결 작업의 비효율 때문인 것으로 추측합니다. 불행히도 순간에 .WRITE
방법 isn't supported varchar (최대) 변수에 대한.
추가
는 또한 nvarchar(max) + nvarchar(max)
및 nvarchar(max) + varchar(max)
을 연결하여 동작을 테스트했습니다. 이 두 가지 모두 2GB 제한을 초과 할 수 있습니다. 이 결과를 표에 저장하려고 시도하면 오류 메시지 Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
이 다시 발생하지만 실패합니다. 그 스크립트는 아래에 있습니다 (실행하는 데 시간이 오래 걸릴 수 있습니다).
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))'나를 위해'4294967294'를 주지만,'SELECT'가 반환 된 후에도 그 여분의 시간이 무엇을하는지 확실히 모릅니다. –