2010-06-03 29 views
7

Tôi cần xóa một cơ sở dữ liệu SQL rất cồng kềnh bằng cách xóa các bản ghi cũ hơn hai năm từ một số bảng. Cách hiệu quả nhất để làm điều này là gì ?.Truy vấn SQL để xóa các bản ghi cũ hơn hai năm

+2

RDBMS là gì? Có bao nhiêu hồ sơ lớn hơn 2 năm?Có bao nhiêu hồ sơ trẻ hơn 2 năm? –

+0

Có một tập hợp phổ biến các trường "được tạo" hoặc "được cập nhật lần cuối" trên mỗi bảng không? –

+1

Thêm sản phẩm SQL bạn đang sử dụng là quan trọng (MSSQL, mySQL, v.v.). Trong MSSQL chẳng hạn, nếu bạn có hàng trăm nghìn hàng, bạn sẽ muốn xem ra cho sự tăng trưởng nhật ký giao dịch. –

Trả lời

15

Bạn có cách nào để xác định bản ghi "cũ" không? (tức là, có một cột trong bảng đại diện cho độ tuổi của hàng hoặc ngày có thể được sử dụng để tính tuổi không?). Nếu vậy, nó phải là một đơn giản

DELETE FROM Table WHERE Age > 2 

Ví dụ, nếu bạn có một cột DateTime gọi CreateDate, bạn có thể làm điều này:

DELETE FROM Table WHERE DATEADD(year, 2, CreateDate) < getdate() 
+2

Có thể khá khó chịu về khóa mặc dù. –

+0

@Martin: Tôi không chắc chắn điều đó có thể tránh được hoặc thậm chí nếu bạn muốn * nó trở thành. Tôi không thấy làm thế nào điều này là "khó chịu" trong điều khoản của khóa hơn bất kỳ 'DELETE' hoặc' UPDATE', khác với thực tế là nó liên quan đến một bảng quét. –

+2

Việc xóa các lô có thể tốt hơn cho đồng thời. –

3

Ngoài câu trả lời tốt Adam Robinson: Khi thực hiện này loại hoạt động:

  1. Chạy truy vấn SELECT với mệnh đề WHERE DELETE trước để đảm bảo bạn đang nhận được "đúng dữ liệu"
  2. Thực hiện sao lưu đầy đủ
  3. Run điều trong "off" giờ để không làm ảnh hưởng đến người sử dụng quá nhiều
0

Tôi đã nhìn thấy dba làm điều này trong một vài công ty khác nhau và nó luôn luôn dường như sử dụng các định dạng sau:

  1. Sao lưu bàn
  2. Drop bất kỳ chỉ số
  3. Chọn các hàng bạn muốn giữ lại vào một bảng temp
  4. trun Cate bảng gốc
  5. Insert (vào bảng nguồn của bạn) từ bạn bảng temp
  6. Tạo lại chỉ số

Lợi ích đối với phương pháp này là này cập nhật doesnt ghi vào các bản ghi vì vậy họ không có được được thổi bởi hàng ngàn mục xóa. Nó cũng nhanh hơn.

Hạn chế là bản cập nhật không ghi vào nhật ký để lựa chọn duy nhất của bạn là khôi phục bản sao lưu.

Bạn nên nghĩ đến việc giữ nhà đúng chỗ. Nếu ở trên, là quá đáng sợ, sau đó bạn cũng có thể sử dụng nhà giữ để winnow cơ sở dữ liệu trong một vấn đề thời gian.

Trong MSSQL, bạn có thể tạo công việc để chạy hàng ngày sẽ xóa 1000 hàng đầu tiên trong truy vấn của bạn. Để ăn cắp truy vấn của Adam -

DELETE TOP 1000 FROM table WHERE DATEADD (năm, 2, Tạo ngày) < getdate()

này sẽ rất an toàn và sẽ thoát khỏi dữ liệu của bạn trong ba tháng hoặc lâu hơn một cách an toàn và họ cũng sẽ duy trì kích thước của db trong tương lai.

Cơ sở dữ liệu của bạn sẽ sử dụng không gian này trong tương lai nhưng nếu bạn muốn khôi phục dung lượng, bạn sẽ cần phải thu hẹp cơ sở dữ liệu. Đọc xung quanh nếu bạn quan tâm - liệu nó có đáng hay không phụ thuộc vào lượng không gian để phục hồi so với tổng kích thước của db.

Các vấn đề liên quan