최근 한 친구가 저에게 SQLSERVER에서 수백만에서 수천만 개의 데이터를 삭제하는 것이 매우 느리다고 말했습니다. 나는 그를 분석하는 데 도움을 주었고 다음과 같은 몇 가지 제안을 했으며 이는 많은 사람들에게 유용할 것입니다. 아직 블로그를 작성하지 않았는데
하드 디스크 공간이 작고 데이터베이스 로그를 최소로 설정하고 싶지 않은 경우(다른 일반 로그는 그대로 두기를 원함) 기록), 상대적으로 빠른 속도 요구 사항이 있고 모든 데이터를 지우는 경우 Turncate table1을 사용하는 것이 좋습니다. 자르기는 DDL 작업이므로 롤백을 생성하지 않으며 로그를 쓰지 않으면 더 빠릅니다. 자동 증가이므로 1로 복원되고 삭제 시 롤백이 발생합니다. 데이터가 많은 테이블을 삭제하면 속도가 매우 느려지고 롤백 세그먼트도 많이 차지하게 됩니다. 물론, 시간<'2006-3-10'과 같은 조건부 삭제가 있는 경우에는 어떻게 해야 합니까? 로깅 없이 삭제를 사용할 수 있습니까? 대답은 '아니요'입니다. 운영. 현재까지는 특정 명령문이 로그에 기록되지 않도록 강제할 수 있는 방법이 없습니다. Time < '2006-3-10'인 Table1을 삭제하면 로그 레코드가 너무 많아 3~4G 정도가 됩니다. 가능한 경우 다음 방법을 제안합니다.
새 테이블에 보관해야 하는 레코드를 선택합니다. 전체 복구 모드를 사용하는 경우
SELECT INTO 레코드 수에 따라 로그가 더 커질 수 있습니다.
Time > = '2006-03-10'인 Table1에서 *를 Table2로 선택한
다음 Table1을 직접 자릅니다. 복구 모델에 관계없이 로깅이 발생하지 않습니다.
Table1 테이블을 자르고
마지막으로 Table2의 이름을 Table1로 바꿉니다.
EC sp_rename 'Table2', 'Table1'
출처: BLOG:domino's 칼럼