운영되는 디비서버에서 로그 테이블에서 날짜 기준 지난 데이터(2014년 이전 데이터)를 삭제하려 합니다.
전체 행이 7천만건 정도 되고 해당 삭제 데이터는 6천만건 정도 됩니다.
삭제 기준이 되는 날짜 컬럼과 identity(1,1)로 되어있는 seq 컬럼 이렇게 두 컬럼에 unique clustered index + pk가 걸려있구요
nonclustered index가 2개 있는 테이블입니다.
트랜잭션 로그 사용량 유지, 안정적인 행 삭제, Locking 최소화 등을 감안해서 (아는거 다 적었음 ^^;;)
삭제 하려면 어떤걸 신경쓰고 어떤 순서대로 처리하면 좋을지 의견 부탁드립니다.
크리스마스 잘 보내시고 감사합니다.
Comment 2
-
아입뻐5
2014.12.29 09:44
-
한태
2016.02.16 22:39
작성자 분의 경우에는 7천만건 중 6천만건을 삭제해야하는 상황이므로 delete 보다는 truncate 실행 후 1천만건의 데이터를
넣어주는 것이 좋을거 같습니다.
이와 관련하여 대량의 데이터를 삭제시 고려해볼 사항에 대해 생각해보았습니다.
대량의 데이터를 delete 하면 rollback이나 에러에 대비하여 log space를 필요로 합니다. 또한 transaction log 디스크에
부하가 생기기에 이에 관련된 다른 DB에도 성능저하가 발생할 수 있습니다.
이를 해결하기 위한 방법 중 하나는 대량의 처리를 소량으로 여러번 나누어 처리하는 것입니다.
SELECT 1
WHILE @@ROWCOUNT > 0
BEGIN
DELETE TOP (1000)
FROM 테이블명
END
위의 쿼리처럼 트랜잭션을 작게 가져가면 대량의 delete를 처리하는 것보다 적은 자원과 공간을 사용하게 됩니다.이는 테이블의 부하를 줄여주고, 트랜잭션로그가 매우 커질 확률을 줄여줄 수 있습니다.위의 쿼리를 기본으로 where 절의 조건을 추가하거나 join 을 이용하여 검색조건을 추가하면 원하는 데이터를 지울 수 있을 것입니다.
우선 답변글이 아니라서 죄송합니다.
저도 쇼핑몰 운영중인데 데이터삭제가 가장 어렵더라구요.. ㅡㅡ;
상품수는 많지않는데 (약 400만건)
데이터를 삭제하면 관련테이블이 7개이상입니다. ㄷㄷ
한건씩 지울라치면 락걸려서 웹서버가 엄청 느려집니다...
안정적으로 지우고 싶은데... 저도 아직까지 방법을 모르고 있어요 ㅡㅡ;