Vào sáng sớm mỗi ngày, một công việc pgAgent làm mới nội dung của bảng A từ bảng B trên cơ sở dữ liệu PostgreQuery 8.4 của tôi. Bảng A chứa khoảng 140 nghìn bản ghi trên 91 cột và có hai chỉ mục - một là một phần của KHÓA CHÍNH và một chỉ mục GIST khác trên cột hình học POINT PostGIS.
Để làm cho quá trình diễn ra nhanh hơn một chút, công việc bỏ chỉ mục trên cột hình học, trước khi xóa các bản ghi trong bảng A và chèn các bản ghi từ bảng B, sau đó chỉ mục được tạo lại. Tất cả điều này được thực hiện, daemon autovacuum sẽ hoạt động khi cảm thấy như vậy (sau mười phút hoặc lâu hơn so với việc so sánh các chỉ số công việc và thống kê bảng cho thời gian hoàn thành công việc và thời gian chạy autovacuum).
Khi kiểm tra trên bàn sáng nay sau khi tất cả những điều này đã xảy ra, các số liệu thống kê bảng cho tôi biết kích thước bảng là 272 MB, kích thước bảng TOAST là 8192byte và kích thước chỉ mục là 23 MB. Cái này có vẻ khá lớn nên tôi đã ban hành lệnh REINDEX trên bảng và kích thước chỉ mục giảm xuống 9832kB.
Câu hỏi của tôi là:
Tại sao REINDEX rõ ràng làm giảm kích thước của các chỉ mục rất nhiều khi các chỉ mục (hoặc ít nhất là chỉ mục cột hình học) đã được xây dựng lại từ đầu? Tôi có nên đảm bảo rằng bảng đã được hút / phân tích trước khi các chỉ mục được xây dựng không? Không bỏ chỉ mục trên khóa chính là một yếu tố trong điều này? Tôi đang thiếu gì?
ANALYZE
kích thước báo cáo cũng giảm.