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

Làm cách nào để xóa dữ liệu đã hết hạn khỏi một bảng lớn mà không làm cho tệp nhật ký phát triển ngoài tầm kiểm soát?

Tôi thấy nó hữu ích khi thực hiện xóa khỏi bảng với một số lượng lớn hàng để xóa các hàng theo lô, chẳng hạn như 5000 hoặc lâu hơn (tôi thường kiểm tra để xem giá trị nào hoạt động nhanh nhất, đôi khi là 5000 hàng, đôi khi là 10.000, v.v.) . Điều này cho phép mỗi thao tác xóa hoàn thành nhanh chóng, thay vì đợi lâu cho một câu lệnh để loại bỏ 400 triệu bản ghi.

Trong SQL Server 2005, một cái gì đó như thế này sẽ hoạt động (tất nhiên là hãy kiểm tra trước):

WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Tôi sẽ thấy những gì xóa hàng loạt ảnh hưởng đến kích thước tệp nhật ký. Nếu nó vẫn làm hỏng nhật ký, thì bạn có thể thử thay đổi Mô hình khôi phục thành Đơn giản , xóa các bản ghi, sau đó chuyển trở lại Bulk Logged, nhưng chỉ khi hệ thống có thể chịu được việc mất một số dữ liệu gần đây. Tôi chắc chắn sẽ tạo một Bản sao lưu đầy đủ trước khi thử quy trình đó. chuỗi này cũng gợi ý rằng bạn có thể thiết lập một công việc để sao lưu các bản ghi chỉ được chỉ định cắt ngắn, vì vậy đó có thể là một tùy chọn khác. Hy vọng rằng bạn có một phiên bản mà bạn có thể kiểm tra, nhưng tôi sẽ bắt đầu với việc xóa theo đợt để xem điều đó ảnh hưởng như thế nào đến hiệu suất và kích thước tệp nhật ký.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thiết lập kết nối ADODB với SQL Server 2008 trong Microsoft Access 2010?

  2. Cách chèn dữ liệu xml vào bảng trong SQL Server 2005

  3. Chuyển đổi nvarchar sang bigint trong Sql server 2008

  4. TSQL - So sánh ngày tháng

  5. SQL Server - tên người dùng hiện tại