몇천만건 정도되는 테이블을 정리하기 위해 삭제 작업을 하거나,
두 개 이상의 테이블을 조인해서 삭제하는 작업이 오래 소요될 것으로 예상될 경우
만건 단위나 십만건 단위로 작업을 하고 싶을 때가 있다.
이렇게 단위별로 나눠서 작업을 하게되면 아래와 같은 장점이 있다.
가령 특정 테이블을 삭제하는 Action을 했는데 예상외로 12시간 이상 삭제가 진행될 경우 이걸 Rollback 하기도, 끝나기를 기다리기도 애매하게 된다. (12시간 삭제 진행하다가 Rollback하게되면 거의 그만큼을 시간이 Rollback 하는데 소요된다.) 이럴 때 특정 건수 단위로 나눠서 했다면, 끊고 새로 시작한 시점까지만 Rollback 하면 된다.
SET ROWCOUNT 10000 --// 삭제할Row 갯수단위 SET NOCOUNT ON
DECLARE @deleted_rows AS INT --// 한트랜잭션에삭제된Row수 DECLARE @total_rows AS INT --// 삭제된총Row수 DECLARE @isStart AS tinyint DECLARE @log AS VARCHAR(8000)
SET @deleted_rows = 999999 SET @total_rows = 0 SET @isStart = 1
WHILE (@deleted_rows > 0) BEGIN BEGIN TRAN -------------------------------------------------------- DELETE FROM 삭제테이블 WHERE 조건 --// 이 부분 수정 --------------------------------------------------------
SET @deleted_rows = @@ROWCOUNT SET @total_rows = @total_rows + @deleted_rows IF (@deleted_rows = 0) BEGIN IF (@isStart = 1) BEGIN SET @log = @log + '삭제대상이없습니다.' PRINT @log BREAK END ELSE BEGIN CONTINUE END END ELSE BEGIN IF (@isStart = 1) BEGIN SET @log = @log + '삭제중... '+CONVERT(varchar(100),@deleted_rows)+' 행이삭제되었습니다. ' END ELSE BEGIN SET @log = @log + '삭제중... '+CONVERT(varchar(100),@deleted_rows)+' 행이삭제되었습니다. (TIME: ' + SUBSTRING(CONVERT(varchar, getdate(),120),12,8) + ')' END END
PRINT @log SET @log = '' SET @isStart = 0 COMMIT TRAN END
|
이걸 실행하게 되면 [메시지] 탭에서 아래와 같은 로그를 볼 수 있습니다.
삭제중... 10000 행이 삭제되었습니다.
|
'SQL > 도움말 팁들!' 카테고리의 다른 글
[MSSQL] 특정 컬럼명을 포함하는 테이블 목록보기 (0) | 2012.07.03 |
---|---|
FK 설정시 충돌이 발생했다? 무슨 이야기지? (0) | 2012.06.28 |
로그파일 LDF 크기 줄이기 (0) | 2012.06.27 |
Sql Server 2000 에서 사용자 로그인계정 정보 가져오는 SP - sp_help_revlogin (0) | 2011.12.10 |
[mssql] 복제(Replication) 구성시 고려 할 점 - Distribution Cleanup에 관하여 (0) | 2011.11.30 |