Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xóa 1 triệu hàng trong SQL Server

Đâ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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL - Bí danh sử dụng =so với as

  2. Tạo bảng bằng nén trong SQL Server (T-SQL)

  3. Nhiều hàng thành một hàng và kết hợp SQL cột

  4. Cách lấy tất cả nhật ký giao dịch (chèn xóa cập nhật) cho một bảng cụ thể trong SQL Server 2008

  5. Làm cách nào để tạo và điền bảng trong một bước duy nhất như một phần của thao tác nhập CSV?