반응형
반응형

.WRITE를 사용하면 테이블 또는 뷰의 기존 데이터를 변경할 수 있습니다.
UPDATE 문을 사용하여 데이터를 변경하면 로그가 기록되지만 .WRITE 절을 사용하여 큰 값 데이터 형식에 대하여 부분 업데이트를 수행하면 최소 로깅됩니다.

varchar(max) + 청크 업데이트(Chunk Update) 성능 비교에 있는 내용을 참고로 읽어 보세요.

UPDATE 문에 .WRITE (expression, @Offset, @Length) 절을 사용하여 varchar(max), nvarchar(max), varbinary(max) 데이터 형식의 부분 또는 전체를 업데이트할 수 있습니다. 다음은 UPDATE 문에 .WRITE 절을 사용하여 테스트해 본 스크립트입니다.

USE NewDatatype
GO

-- 테이블 및 테스트 데이터 생성하기
CREATE TABLE max_write (
 id int,
 maxcol varchar(max));
GO
INSERT max_write (id, maxcol) VALUES (1, '012..56..9');
GO
SELECT * FROM max_write WHERE id = 1;
GO
--> 012..56..9

-- 1) 부분 대체
UPDATE max_write SET maxcol .WRITE ('34', 3, 2) WHERE ID = 1 ;
GO
SELECT * FROM max_write WHERE ID = 1 ;
GO
--> 0123456..9

-- 2) 부분 제거
UPDATE max_write SET maxcol .WRITE ('', 7, 2) WHERE ID = 1 ;
GO
SELECT * FROM max_write WHERE ID = 1;
GO
--> 01234569

-- 3) expression을 NULL로 지정 --> @Offset부터 끝까지 삭제
UPDATE max_write SET maxcol .WRITE (NULL, 7, 0) WHERE ID = 1 ;
GO
SELECT * FROM max_write WHERE ID = 1;
GO
--> 0123456

-- 4) @Offset을 NULL로 지정 --> 마지막 부분에 데이터 추가 (@Length는 무시됨)
UPDATE max_write SET maxcol .WRITE ('789', NULL, NULL) WHERE ID = 1 ;
GO
SELECT * FROM max_write WHERE ID = 1;
GO
--> 0123456789

-- 5) @Length를 NULL로 지정 --> @Offset 위치부터 시작하여 끝까지 모두 대체
UPDATE max_write SET maxcol .WRITE ('***', 10, NULL) WHERE ID = 1 ;
GO
SELECT * FROM max_write WHERE ID = 1;
GO
--> 0123456789***

-- 테스트 테이블 삭제
DROP TABLE max_write;
GO
반응형
반응형

SQL Server 2005에 varchar(max), nvarchar(max), varbinary(max) 데이터 형이 도입되면서 해당 컬럼을 수정하는데 이용되는 .write() 형태의 Chunk Update 문이 추가되었습니다.


다음 데모 스크립트는 Concatenate 작업에 단순 + 연산자와 .write()를 이용한 청크 업데이트 간의 성능 차이를 확인할 수 있는 데모 스크립트 입니다..
PC에서 수행할 경우, 10000회를 1000회 또는 5000회 정도로 낮춰서 수행해 보시기 바랍니다....




/****************************************************************

             varchar(max) +  청크업데이트(Chunk Update) 사용

****************************************************************/

 

--테스트용테이블변수정의

DECLARE @T TABLE (V VARCHAR(MAX))

INSERT INTO @T VALUES ('')

 

DECLARE @I INT, @S DATETIME

SET @S = GETDATE()

SET @I = 0

WHILE @I < 10000

BEGIN

             UPDATE @T

             SET V.WRITE (REPLICATE('A',10),NULL,NULL)

            

             SET @I = @I + 1

END

SELECT DATEDIFF(MS,@S,GETDATE()), LEN(V) FROM @T

GO

--826     100000 : 수행시간0.826, V 컬럼의길이100,000

 


/****************************************************************

             varchar(max) +  '+' 연산자사용

****************************************************************/

DECLARE @T TABLE (V VARCHAR(MAX))

INSERT INTO @T VALUES ('')

 

DECLARE @I INT, @S DATETIME

SET @S = GETDATE()

SET @I = 0

WHILE @I < 10000

BEGIN

             UPDATE @T

             SET V = V + REPLICATE('A',10)

            

             SET @I = @I + 1

END

SELECT DATEDIFF(MS,@S,GETDATE()), LEN(V) FROM @T

GO

 

--7343   100000 : 수행시간7.3, V 컬럼의길이100,000




/****************************************************************

    테스트 환경 : 2794 Mhz * 8 CPU,   8 GB Memory,  Win 2003 SP1        
****************************************************************/

반응형

+ Recent posts

반응형