내 답변은 논쟁을 피하기 위해 일괄 처리 방식 (작은 대기 시간 포함)으로 Brett Schneiders에서 시작했으며 폭발적인 로그 파일 증가를 완화합니다.
초기 @batchcount
을 서버에서 처리 할 수있는 것으로 설정하십시오. 필요에 따라 대기 시간을 늘리거나 줄일 수도 있습니다. @@ROWCOUNT=0
이되면 루프가 종료됩니다.
declare @batchcount int, @totalrows int
set @totalrows = 0
set @batchcount = 10000 -- set this to some initial value
while @batchcount > 0
begin
;with dupes as (
SELECT id
, ROW_NUMBER() over (PARTITION by field order by id desc) rownum
FROM [TableName]
)
delete top (@batchcount) t1
from TableName t1
join dupes c
on c.id = t1.id
and c.rownum > 1
set @batchcount = @@ROWCOUNT --record how many just got nuked
set @totalrows = @totalrows + @batchcount --track progress
print cast(@totalrows as varchar) + ' rows have been deleted' -- show progress
waitfor delay '00:00:05' -- wait 5 seconds for log writes, other queries etc
end
인쇄 문 ... 인내심을하지 SSMS의 모든 루프의 "쇼"하지만 모든 너무 자주 사용하면 SQL 메시지가 완료된 반복의 수백을 보여주는 표시 볼 수 있습니다.
중복으로 말하면이 링크를 확인하면 도움이됩니다. https://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows – g2server