로그를 기록하는 테이블 같은 경우 어이가 없을 정도로 사이즈가 커지곤 한다. 그래서 보통 주기적으로 삭제를 해주곤 하는데....
문제는 테이블이 너무 크다 보니 삭제하다가 DB가 죽는 경우가 생긴다는 거다. 모.. 저녁에 DELETE 걸어놓고 퇴근했는데 다음날 아침까지 안 끝난다던지.. 놀래서 트랜잭션을 취소시키면... 그자리에서 롤백을 시작할 것이고... (생각만 해도.. 암담하다. ^^)

많은 양의 데이터를 삭제할 때는 적당히 잘라서 여러번 삭제해주는 센스가 필요하다.

SQL SERVER 2005는 DELETE 문에 TOP을 줄 수 있지만, SQL SERVER 2000은 그게 안된다. 그래서.. 다음과 같이 SELF JOIN하여 DELETE 해주어야 한다.

DELETE TEST_TAB
FROM  (SELECT TOP 1000 *
       FROM TEST_TAB 
       WHERE LOG_DATE > '2008-01-01 00:00:00') AS A
WHERE TEST_TAB.SEQ = A.SEQ
이걸 끝날때까지 반복해주어야 하니까...


DELETE TEST_TAB
FROM (SELECT TOP 1000 * FROM TEST_TAB 
                 WHERE LOG_DATE > '2008-01-01 00:00:00') AS A
WHERE TEST_TAB.SEQ = A.SEQ

WHILE (@@rowcount > 0)
BEGIN
    DELETE TEST_TAB
    FROM (SELECT TOP 1000 * FROM TEST_TAB 
              WHERE LOG_DATE > '2008-01-01 00:00:00') AS A
    WHERE TEST_TAB.SEQ = A.SEQ
END

이렇게 하면 된다.

요점은...

오래 걸릴 지언정 최소한 죽지는 않게 하자. :)

는 것이다.

 


Posted by kuaaan
,


사랑합니다. 편안히 잠드소서