Phải làm gì sau khi xóa một triệu hồ sơ


7

Chúng tôi đang triển khai một tính năng mới trong hệ thống của mình, điều này sẽ khiến khoảng một triệu bản ghi (mỗi bản ghi là nhỏ, về cơ bản là GUID, ngày và bốn smallinttrường) sẽ bị xóa khỏi bàn mỗi đêm. Về cơ bản, đây là bảng bộ đệm và khi dữ liệu được 7 ngày, chúng tôi sẽ thực hiện:

DELETE FROM scheduleCache WHERE schDateCreated < '2013-08-26

Điều này sẽ chạy mỗi đêm vào lúc 1 giờ sáng và sẽ thanh lọc khoảng một triệu hồ sơ mỗi khi nó chạy.

Có bất cứ điều gì tôi nên lưu ý hoặc làm cho một bảng như thế này? Bất kỳ thuộc tính nào tôi nên đặt trên bàn, hoặc bất kỳ thói quen nào tôi nên chạy thường xuyên để "dọn dẹp"? Tôi chưa bao giờ xử lý một bảng như thế này trước đây.

Bảng này có một chỉ mục được nhóm (GUID + một trong các smallinttrường) và chúng tôi có một bản dựng lại chỉ mục hàng tuần chạy vào buổi sáng Chủ nhật.

Câu trả lời:


7

Vấn đề xóa các phần lớn của một bảng khác xa với một vấn đề nhỏ. Cách tiếp cận tốt nhất, cho đến nay, là phân vùng. Lược đồ phân vùng hàng ngày với cửa sổ trượt thực sự là một viên đạn thần kỳ cho vấn đề này, hãy xem Cách triển khai Cửa sổ trượt tự động trong Bảng được phân vùng .

Nếu bạn không đủ khả năng phân vùng (ví dụ: giấy phép phi doanh nghiệp trên trang web) thì tôi khuyên bạn nên phân cụm theo schDateCreated. Nếu bạn cần khóa chính trên GUID + smallint thì hãy chuyển nó sang không phân cụm. Xóa theo lô (ví dụ TOP 10000:), trong một vòng lặp, để giảm áp lực lên nhật ký. Xem xét cập nhật số liệu thống kê sau khi hoạt động.


Thật không may, chúng tôi không đủ khả năng phân vùng, chúng tôi cũng không thể yêu cầu cài đặt trang web của khách hàng trả một kích thước nâng cấp đó chỉ để giữ cho chức năng này hoạt động trơn tru. Tôi sẽ bắt đầu nó với chỉ mục được nhóm như bạn đề xuất và xem cách chúng tôi đi từ đó.
Mark Henderson

Cũng giống như theo dõi, tôi đã tạo một chỉ mục nhóm trên trường ngày, đã làm DELETE TOP 10000 WHILE COUNT() > 0và nó đã hoạt động rất tốt trong vài tháng.
Mark Henderson

4

Một giải pháp sẽ là lưu trữ dữ liệu trong một bảng mỗi ngày, bỏ các bảng khi chúng hết bộ nhớ cache. Các bảng sẽ có tên như cache_ (ngày julian).

Một giải pháp khác là có một tập hợp các bảng cache_0 thành cache_n, cắt bớt từng bảng trước khi bạn sử dụng nó. Bạn sẽ sử dụng bộ đệm bảng _ ((ngày julian) modulo (chu kỳ chu kỳ)) cho mỗi ngày.

Bạn sẽ cần xử lý cuối năm một cách cẩn thận, vì bạn sẽ chuyển từ 365 hoặc 365 sang 0 cho một trong hai giải pháp.


Thật vậy, hai điều này sẽ hoạt động, tuy nhiên tôi muốn tránh có nhiều bảng cho a) bộ nhớ đệm kế hoạch thực hiện và b) Tôi biết một số khách hàng không cho create tablephép ứng dụng
Mark Henderson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.