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

대용량 삭제·아카이빙

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

5. 자주 하는 실수 (Tip)

실수 1: 수천만 건을 한 문장으로 지운다

언두·로그가 부풀고 잠금이 오래 유지되며 실패하면 롤백도 오래 걸립니다. 1,000~10,000건 정도로 나눠서 청크마다 커밋하고 남은 대상이 0건이 될 때까지 되풀이합니다.

실수 2: 조건 컬럼에 인덱스가 없다

WHERE log_date < 기준일 인데 log_date 에 인덱스가 없으면 청크마다 표 전체를 훑습니다. 대상이 몇 번에 나눠지든 그만큼 전체 읽기가 되풀이되므로, 삭제 전에 인덱스를 확인합니다.

실수 3: 복사와 삭제를 따로 커밋한다

INSERT 를 커밋하고 DELETE 를 나중에 하면, 그 사이 실패에 양쪽에 같은 행이 남습니다. DELETE 를 먼저 커밋하면 유실됩니다. 같은 키 집합과 조건으로 같은 트랜잭션에서 실행하고 건수를 대사한 뒤 커밋합니다.

실수 4: 지웠는데 공간이 줄지 않았다고 놀란다

삭제해도 표 안의 공간은 빈 채로 남는 것이 정상입니다. Oracle 은 HWM 이 그대로여서 전체 읽기가 그대로 느리고, MySQL 은 파일이 줄지 않습니다. 필요하면 SHRINK SPACE·OPTIMIZE TABLE·REBUILD 로 정리합니다.

실수 5: 바꿔치기한 뒤 인덱스와 제약이 없다

CREATE TABLE AS SELECT 는 데이터만 복사합니다. PK·인덱스·FK·권한·트리거를 다시 만들지 않고 이름을 바꾸면 조회가 느려지거나 중복이 들어갑니다. 교체 전에 새 표에서 미리 만들고, 작업 중에는 원본 쓰기를 막습니다.

팁

삭제·이동 배치는 청크 번호, 기준일, 처리 건수, 남은 대상 건수를 로그로 남깁니다. 실패했을 때 어디까지 갔는지 알 수 있고, 다음에 크기를 조정할 근거가 됩니다.