Đối với bất kỳ ai đến đây tìm kiếm cách xóa phân vùng bảng trong PostgreSQL, đây là câu trả lời hiện đại.
Giải pháp là không sử dụng câu lệnh DELETE vì điều đó sẽ xóa dữ liệu mà không làm giảm các phân vùng bảng tương ứng chứa dữ liệu. OP đã hỏi về việc quản lý các bảng phân vùng, không xóa các bản ghi, vì vậy bất kỳ giải pháp nào sử dụng câu lệnh DELETE đều bổ sung thêm chi phí cơ sở dữ liệu không cần thiết về việc xóa các bản ghi, để lại các bảng phân vùng trống tại chỗ và hoàn toàn bỏ qua một trong những lợi ích chính của việc sử dụng phân vùng; DROPing bảng khi nó không còn hữu ích.
Trong trường hợp này, giải pháp phải là DROP bảng phân vùng không cần thiết nữa. Tôi đã viết một giải pháp để giải quyết vấn đề này trong môi trường sản xuất của mình, câu trả lời là tại đây .
Để giải quyết vấn đề của OP, chức năng tôi đã viết có thể được sử dụng với hai bản sửa đổi nhỏ để sửa đổi fullTablename biến và định dạng ngày tháng. Dòng biến fullTablename phải được thay đổi từ
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
sang định dạng YYYY-MM-DD_log như thế này
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Sau đó, định dạng ngày cần được sửa đổi một chút từ
WHEN partition_plan='day' THEN 'YYYYDDD'
theo quy ước đặt tên bảng đã nêu
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Sau đó, truy vấn SQL gọi hàm để thực hiện dọn dẹp có thể được gọi từ một tập lệnh bảo trì hàng ngày như sau:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Cái nào sẽ XÓA các bảng YYYY-MM-DD_log là 5 ngày cũ hơn 180 ngày trước. Đối với lần chạy ban đầu để xóa hàng chục hoặc hàng trăm phân vùng bảng cũ, 5 có thể được đặt thành giá trị cao hơn nhiều để đạt được hiệu quả mong muốn.