본문 바로가기

SQL/도움말 팁들!

대량의 테이블 N개 단위로 끊어서 삭제하기

몇천만건 정도되는 테이블을 정리하기 위해 삭제 작업을 하거나,

두 개 이상의 테이블을 조인해서 삭제하는 작업이 오래 소요될 것으로 예상될 경우

만건 단위나 십만건 단위로 작업을 하고 싶을 때가 있다.

 

이렇게 단위별로 나눠서 작업을 하게되면 아래와 같은 장점이 있다.

가령 특정 테이블을 삭제하는 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 행이 삭제되었습니다.
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:24)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:26)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:29)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:33)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:37)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:43)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:11:53)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:12:01)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:12:06)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:12:14)
삭제중... 10000 행이 삭제되었습니다.    (TIME: 15:12:24)