Có nên luôn luôn VACUUM ANALYZE trước khi REINDEXing trong PostgreQuery 8.4 không?


8

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ì?


1
Có điều gì ngăn cản bạn nâng cấp lên 9.3 không? Mặt khác, tôi không nhớ 8.4 quá nhiều, nhưng có thể là kích thước chỉ khác nhau vì bảng không được phân tích gần đây? Tôi cũng sẽ kiểm tra (nếu có thể) nếu sau khi đơn giản ANALYZEkích thước báo cáo cũng giảm.
dezso

@dezso Chúng tôi không thể cập nhật lên phiên bản mới hơn trong tương lai gần. Tôi sẽ thử phân tích lại vào cơ hội tiếp theo sau một trong những lần làm mới hàng ngày - ANALYZE có thu thập số liệu thống kê về các chỉ mục không?
UrsineWelles

@deszo Phát hành PHÂN TÍCH VACUUM kiểm tra kết quả và sau đó REINDEXing đưa ra mức giảm mạnh như vậy trong kích thước chỉ mục.
UrsineWelles

Hoặc, trong khi về chủ đề nâng cấp, tại sao không chuyển thẳng sang phiên bản hiện tại 9.4 ? Postgres 8.4 đã đạt EOL vào năm 2014. Việc hút bụi và lập chỉ mục đã được làm lại và cải thiện nhiều lần kể từ đó.
Erwin Brandstetter

@ErwinBrandstetter - chúng tôi đang tiến tới cập nhật tại đây ... Chẳng bao lâu nữa, các đồng nghiệp của tôi sẽ cập nhật phần mềm cho phép họ nâng cấp lên Cadcorp SIS 8.0, điều này sẽ cho phép chúng tôi nâng cấp lên Postgres (lên 9.3). Tôi mong muốn được gặt hái những phần thưởng hút bụi và lập chỉ mục!
UrsineWelles 24/2/2015

Câu trả lời:


3

Nếu câu lệnh CREATE INDEX thấy rằng một phiên khác có ảnh chụp nhanh hoạt động có thể vẫn quan tâm đến các bản ghi bị xóa, thì nó bao gồm các bản ghi bị xóa vào chỉ mục mới.

Tương tự, nếu REINDEX thấy rằng một phiên khác có ảnh chụp nhanh hoạt động có thể vẫn quan tâm đến các bản ghi bị xóa, thì nó bao gồm các bản ghi bị xóa vào chỉ mục mới.

Nếu một VACUUM thấy rằng một phiên khác giữ một ảnh chụp nhanh hoạt động mà vẫn có thể quan tâm đến các bản ghi bị xóa, thì nó sẽ giữ các bản ghi đó trong bảng. Và sau đó, REINDEX hoặc CREATE INDEX cũng cần mang chúng vào chỉ mục mới, miễn là ảnh chụp nhanh vẫn tồn tại.

Khi có hoặc không còn bất kỳ ảnh chụp nhanh nào có thể nhìn thấy các hàng đã xóa, thì VACUUM có thể xóa chúng khỏi bảng. Nhưng một CREATE INDEX hoặc REINDEX cũng có thể không mang chúng vào chỉ mục mới, cho dù VACUUM có nhận được để loại bỏ chúng khỏi khả năng hay không.

Vì vậy, trong kịch bản của bạn, vai trò của VACUUM giữa CREATE INDEX và REINDEX ban đầu có lẽ chỉ là để chiếm thời gian, trong thời gian đó, giao dịch dài hạn của bạn hy vọng sẽ tự biến mất và giảm ảnh chụp nhanh.


Đó phải là nó. Tôi sẽ phải giữ một chiếc đồng hồ cho các giao dịch như vậy.
UrsineWelles

Là reindexing cần thiết cho postgres 9.3?
Munai Das Udasin

0

Đã thử các lệnh khác nhau để thực hiện mọi việc, dường như thực hiện VACUUM trước lệnh REINDEX là cách duy nhất để giảm kích thước, có lẽ vì không gian không chân không thêm vào chỉ mục (lập chỉ mục các bản ghi bị xóa?). Buộc viết lại bảng bằng cách sử dụng

ALTER TABLE blah ALTER COLUMN whiffle SET DATA TYPE whiffle_type;

làm điều tương tự, vì nó dọn sạch không gian bị sử dụng.

Việc phải VACUUM ở giữa quy trình sẽ phá vỡ dòng chảy một chút vì người ta phải phát lệnh VACUUM bên ngoài giao dịch.


Bạn đang xóa hoặc cắt bớt? Và bạn đã đặt fillfactor 100 trên các chỉ mục đó chưa?
David Aldridge

Xin chào @DavidAldridge. Tôi đang xóa chứ không phải cắt ngắn. Fillfactor là mặc định.
UrsineWelles 4/12/2015
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.