Đây là một cấu trúc để xóa hàng loạt như đã đề xuất ở trên. Đừng thử 1 triệu cùng một lúc ...
Kích thước của lô và thời gian chờ đợi rõ ràng là khá thay đổi và sẽ phụ thuộc vào khả năng máy chủ của bạn, cũng như nhu cầu của bạn để giảm thiểu sự tranh chấp. Bạn có thể cần phải xóa một số hàng theo cách thủ công, đo thời gian chúng mất và điều chỉnh kích thước lô của bạn thành thứ mà máy chủ của bạn có thể xử lý. Như đã đề cập ở trên, bất kỳ thứ gì trên 5000 đều có thể gây ra khóa (mà tôi không biết).
Điều này sẽ được thực hiện tốt nhất sau nhiều giờ ... nhưng 1 triệu hàng thực sự không phải là quá nhiều để SQL xử lý. Nếu bạn xem tin nhắn của mình trong SSMS, có thể mất một lúc để đầu ra bản in hiển thị, nhưng nó sẽ xuất hiện sau nhiều đợt, chỉ cần lưu ý là nó sẽ không cập nhật theo thời gian thực.
Chỉnh sửa:Đã thêm thời gian dừng @MAXRUNTIME
&@BSTOPATMAXTIME
. Nếu bạn đặt @BSTOPATMAXTIME
thành 1, tập lệnh sẽ tự dừng vào thời điểm mong muốn, chẳng hạn như 8 giờ sáng. Bằng cách này, bạn có thể lên lịch hàng đêm để bắt đầu lúc nửa đêm và sẽ dừng trước khi sản xuất lúc 8 giờ sáng.
Chỉnh sửa:Câu trả lời khá phổ biến, vì vậy tôi đã thêm RAISERROR
thay cho PRINT
mỗi nhận xét.
DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
SET DEADLOCK_PRIORITY LOW;
SET @BATCHSIZE = 4000
SET @WAITFORVAL = '00:00:10'
SET @MAXRUNTIME = '08:00:00' -- 8AM
SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME
SET @ITERATION = 0 -- LEAVE THIS
SET @TOTALROWS = 0 -- LEAVE THIS
WHILE @BATCHSIZE>0
BEGIN
-- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME...
IF CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1
BEGIN
RETURN
END
DELETE TOP(@BATCHSIZE)
FROM SOMETABLE
WHERE 1=2
SET @[email protected]@ROWCOUNT
SET @[email protected]+1
SET @[email protected][email protected]
SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
RAISERROR (@MSG, 0, 1) WITH NOWAIT
WAITFOR DELAY @WAITFORVAL
END