로그를 기록하는 테이블 같은 경우 어이가 없을 정도로 사이즈가 커지곤 한다. 그래서 보통 주기적으로 삭제를 해주곤 하는데....
문제는 테이블이 너무 크다 보니 삭제하다가 DB가 죽는 경우가 생긴다는 거다. 모.. 저녁에 DELETE 걸어놓고 퇴근했는데 다음날 아침까지 안 끝난다던지.. 놀래서 트랜잭션을 취소시키면... 그자리에서 롤백을 시작할 것이고... (생각만 해도.. 암담하다. ^^)
많은 양의 데이터를 삭제할 때는 적당히 잘라서 여러번 삭제해주는 센스가 필요하다.
SQL SERVER 2005는 DELETE 문에 TOP을 줄 수 있지만, SQL SERVER 2000은 그게 안된다. 그래서.. 다음과 같이 SELF JOIN하여 DELETE 해주어야 한다.
문제는 테이블이 너무 크다 보니 삭제하다가 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
이렇게 하면 된다.
요점은...
오래 걸릴 지언정 최소한 죽지는 않게 하자. :)
는 것이다.
'SQL Server' 카테고리의 다른 글
배치작업으로 TABLE을 동기화 할 때 주의사항 (0) | 2008.08.25 |
---|---|
테이블에 블로킹이 풀리지 않을 때의 응급조치방법 (0) | 2008.08.24 |
여러개의 테이블에서 JOIN하여 UPDATE 및 DELETE하는 SQL (5) | 2008.08.21 |
MAX, COUNT등 GROUP함수 사용시 주의할 점 (1) | 2008.08.17 |
데드락이 발생할 때의 원인분석 (0) | 2008.08.17 |