홈 › 대용량·배치 › 08 / 8

대용량 삭제·아카이빙

나눠서 삭제, 남길 것만 옮기기, 보관 테이블
섹션 6진행 0 / 8

6. 정리

한 번에 큰 DELETE 는 행마다 언두·로그를 남기고 잠금을 오래 잡으며 실패하면 롤백도 오래 걸립니다. 그래서 1,000~10,000건 정도로 나눠 청크마다 커밋하고, 삭제된 행이 0건이 될 때까지 되풀이합니다. 청크 문법은 Oracle 은 ROWNUM, MySQL 은 DELETE ... LIMIT, MSSQL 은 DELETE TOP 이고, 키 범위로 나누면 어느 DB 에서나 같습니다. 조건 컬럼에 인덱스가 없으면 청크마다 전체를 훑습니다.

지운 데이터를 보관해야 하면 같은 키 집합·같은 조건으로 INSERT 와 DELETE 를 한 트랜잭션에 묶고, 복사 건수를 확인한 뒤 커밋하며, 끝나면 원본과 보관의 합계를 대사합니다. MSSQL 은 DELETE ... OUTPUT ... INTO 로 한 문장에 옮길 수 있습니다.

대부분을 지울 때는 남길 행만 새 표로 복사하고 인덱스·제약을 다시 만든 뒤 이름을 바꿔치기하는 편이 빠르지만 작업 중 쓰기를 막아야 합니다. 표 전체를 비울 때는 TRUNCATE 이고, 날짜 기준 정기 삭제는 파티션이 가장 가볍습니다.

삭제해도 공간은 바로 줄지 않습니다. Oracle 은 SHRINK SPACE 나 MOVE, MySQL 은 OPTIMIZE TABLE, MSSQL 은 인덱스 REBUILD 로 정리하고, 파일 축소는 신중히 합니다.

대용량·배치 카테고리를 돌아보면, 실행 계획 읽기와 조인 방식에서 시작해 인덱스 튜닝, 통계와 힌트, 파티션, 대량 처리, 락과 데드락, 그리고 이번 삭제·아카이빙까지 "많은 데이터를 안전하게 빠르게 다루는" 방법을 8개 주제로 다루었습니다. 다음 카테고리는 DB별 비교 요약으로, Oracle·MySQL·MSSQL 의 문법과 동작 차이를 한눈에 정리합니다.