Tôi quản lý một ứng dụng có dữ liệu rất lớn (gần 1TB dữ liệu với hơn 500 triệu hàng trong một bảng) cơ sở dữ liệu Oracle back end. Cơ sở dữ liệu không thực sự làm bất cứ điều gì (không SProcs, không kích hoạt hoặc bất cứ điều gì) nó chỉ là một kho lưu trữ dữ liệu.
Hàng tháng chúng tôi được yêu cầu thanh lọc hồ sơ từ hai trong số các bảng chính. Các tiêu chí cho thanh trừng khác nhau và là sự kết hợp giữa tuổi hàng và một vài trường trạng thái. Chúng tôi thường kết thúc thanh trừng từ 10 đến 50 triệu hàng mỗi tháng (chúng tôi thêm khoảng 3-5 triệu hàng mỗi tuần thông qua nhập khẩu).
Hiện tại chúng tôi phải thực hiện việc xóa này theo lô khoảng 50.000 hàng (nghĩa là xóa 50000, comit, xóa 50000, cam kết, lặp lại). Việc cố gắng xóa toàn bộ lô cùng một lúc khiến cơ sở dữ liệu không phản hồi trong khoảng một giờ (tùy thuộc vào # hàng). Việc xóa các hàng theo đợt như thế này là rất khó khăn trên hệ thống và chúng tôi thường phải thực hiện "khi thời gian cho phép" trong suốt một tuần; cho phép tập lệnh chạy liên tục có thể dẫn đến suy giảm hiệu suất không thể chấp nhận được đối với người dùng.
Tôi tin rằng loại xóa hàng loạt này cũng làm giảm hiệu suất của chỉ mục và có các tác động khác cuối cùng làm cho hiệu suất của cơ sở dữ liệu bị suy giảm. Có 34 chỉ mục trên một bảng và kích thước dữ liệu chỉ mục thực sự lớn hơn chính dữ liệu.
Đây là kịch bản mà một trong những người CNTT của chúng tôi sử dụng để thực hiện việc thanh lọc này:
BEGIN
LOOP
delete FROM tbl_raw
where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;
exit when SQL%rowcount < 49999;
commit;
END LOOP;
commit;
END;
Cơ sở dữ liệu này phải tăng 99.99999% và chúng tôi chỉ có một cửa sổ bảo trì 2 ngày một lần mỗi năm.
Tôi đang tìm kiếm một phương pháp tốt hơn để xóa những hồ sơ này, nhưng tôi chưa tìm thấy. Bất kỳ đề xuất?