Là một REINDEX cần thiết sau CLUSTER?


12

Tôi đang xem xét sử dụng CLUSTER để sắp xếp lại một bảng theo chỉ mục. Tôi hiểu rằng việc giải trí dữ liệu bảng này làm cho tất cả các chỉ mục hiện có hoặc phình to hoặc vô dụng. Tôi đã thấy một số dấu hiệu cho thấy cần phải có REINDEX sau CLUSTER. Tôi đã tìm thấy các tài liệu tham khảo khác chỉ ra rằng CLUSTER thực hiện REINDEX. Các tài liệu chính thức cho biết gì cả về reindex là một phần của CỤM hoặc được yêu cầu (Mặc dù nó gợi ý chạy PHÂN TÍCH sau CỤM)

Bất cứ ai cũng có thể dứt khoát (tức là với một số loại tham chiếu đến các tài liệu chính thức) có thể nói liệu REINDEX có được yêu cầu sau CLUSTER không?


2
Tôi không nghĩ nó cần thiết. clusterThay đổi vị trí các hàng, vì vậy dù sao nó cũng sẽ phải cập nhật thông tin chỉ mục.
a_horse_with_no_name

Có, nhưng lý thuyết trong một nửa các cuộc thảo luận tôi đã tìm thấy là nguyên nhân khiến chỉ số bị phình to.
TREE

Câu trả lời:


12

Bạn không cần phải reindex, bởi vì CLUSTERnó thực sự làm điều đó cho bạn.

Cụ thể hơn, CLUSTERkhóa bảng nguồn sau đó tạo một bản sao mới của nó được sắp xếp theo chỉ mục đích. Nó tạo các chỉ mục trên bản sao mới sau đó thay thế bảng cũ và lập chỉ mục bằng bảng mới.

Lưu ý rằng điều này cũng đúng VACUUM FULLtrong 9.0+.

Nếu bạn đã thấy các cuộc thảo luận cho thấy CLUSTERcác chỉ số phình to thì đó có thể là những người cho rằng nó CLUSTERhoạt động như trước 9.0 VACUUM FULL. Bạn cũng có thể nhìn thấy và hiểu sai các cuộc thảo luận mà chỉ đề cập đến sưng lên gây ra bởi sự cũ VACUUM FULLthực hiện và đề xuất CLUSTERnhư một sự thay thế .

Điều này được ngụ ý trong tài liệu :

một bản sao tạm thời của bảng được tạo có chứa dữ liệu bảng theo thứ tự chỉ mục. Bản sao tạm thời của mỗi chỉ mục trên bảng cũng được tạo ra . Do đó, bạn cần không gian trống trên đĩa ít nhất bằng tổng kích thước bảng và kích thước chỉ mục

Những gì nó không nói, nhưng nên, là những bản sao tạm thời sau đó thay thế bảng gốc . (Mỏ của tôi).


1
Bạn có bất cứ tài liệu tham khảo nào mà CLUSTER thay thế các chỉ mục không?
TREE

1
@TREE Đã thêm. Các tài liệu không cho bạn biết rõ ràng rằng bảng tạm thời và các chỉ mục sau đó thay thế các bản gốc, nhưng bạn sẽ thấy đó là trường hợp nếu bạn thực sự nhìn vào thư mục dữ liệu trước / sau CLUSTER hoặc nếu bạn kiểm tra mã nguồn.
Craig Ringer

Tôi đã thử nghiệm điều này và trong ít nhất kịch bản thử nghiệm của tôi, kích thước tệp chỉ mục đã giảm. Nhưng đây chỉ là một kịch bản và có thể có nhiều biến số ảnh hưởng đến hành vi (số lượng chỉ mục, tổng kích thước trên đĩa, v.v.) vì vậy tôi không thể tin tưởng vào một thử nghiệm đơn giản.
TREE

1
@TREE Để chắc chắn tuyệt đối trong việc hiểu hành vi trong mọi trường hợp có thể, bạn sẽ cần phải đọc mã nguồn. Tất cả tôi có thể nói với bạn là tôi không biết về bất kỳ tình huống trong đó CLUSTERkhông không viết lại các chỉ số, và kiểm tra các tập tin thực tế trong base/sẽ hiển thị rõ ràng mới relfilenodes. Có vẻ như bạn đang lo lắng về những vấn đề bạn chưa có.
Craig Ringer

8

Tôi với a_horse_with_no_name về điều này: bạn không cần phải tạo lại các chỉ mục. Bên cạnh đó, CLUSTERtài liệu không đề cập đến nó, chúng tôi cũng có thể tham khảo thêm về REINDEXtrang:

Có một số trường hợp sử dụng REINDEX:

  • Một chỉ mục đã bị hỏng và không còn chứa dữ liệu hợp lệ. Mặc dù về lý thuyết, điều này không bao giờ xảy ra, trong thực tế, các chỉ mục có thể bị hỏng do lỗi phần mềm hoặc lỗi phần cứng. REINDEX cung cấp một phương thức phục hồi.

  • Một chỉ mục đã trở nên "cồng kềnh", rằng nó chứa nhiều trang trống hoặc gần như trống. Điều này có thể xảy ra với các chỉ mục cây B trong PostgreSQL theo các mẫu truy cập không phổ biến nhất định. REINDEX cung cấp một cách để giảm mức tiêu thụ không gian của chỉ mục bằng cách viết một phiên bản mới của chỉ mục mà không có các trang chết. Xem Phần 23.2 để biết thêm thông tin.

  • Bạn đã thay đổi một tham số lưu trữ (chẳng hạn như fillfactor) cho một chỉ mục và muốn đảm bảo rằng thay đổi đã có hiệu lực đầy đủ.

  • Việc xây dựng chỉ mục với tùy chọn CONCURRENTLY không thành công, để lại chỉ mục "không hợp lệ". Các chỉ mục như vậy là vô ích nhưng có thể thuận tiện khi sử dụng REINDEX để xây dựng lại chúng. Lưu ý rằng REINDEX sẽ không thực hiện xây dựng đồng thời. Để xây dựng chỉ mục mà không can thiệp vào sản xuất, bạn nên bỏ chỉ mục và cấp lại lệnh CREATE INDEX CONCURRENTLY.

Rõ ràng, CLUSTERkhông rơi vào bất kỳ trường hợp nào.

Và có một câu nhỏ trong các CLUSTERtài liệu:

[trong khi phân cụm] Bản sao tạm thời của mỗi chỉ mục trên bảng cũng được tạo.

Điều này cho thấy rằng giống như chính bảng, các chỉ mục cũng được sắp xếp lại trong quá trình - cách này làm cho việc giới thiệu lại trở nên vô dụng.


Đề xuất chắc chắn là có, và thử nghiệm dường như xác nhận nó. Tôi sẽ cảm thấy tốt hơn khi dựa vào hành vi này nếu các tài liệu thực sự nói rằng các chỉ mục được tạo lại (vĩnh viễn).
TREE

2
Tôi thấy công cụ cho một bản vá doc ở đây. Hướng dẫn nên rõ ràng hơn về việc tạo lại các chỉ mục.
Erwin Brandstetter

Sự nghi ngờ của tôi tại thời điểm này là các nhà phát triển không muốn chính thức ghi lại hành vi này vì họ không muốn bị ràng buộc vĩnh viễn với việc thực hiện này.
TREE

@TREE có nhiều thay đổi tính năng giữa các phiên bản và tài liệu thay đổi (chủ yếu) tương ứng. Có lẽ các thông số kỹ thuật cũng thay đổi :), vì vậy tôi thấy không có sự ràng buộc ở bất cứ đâu.
dezso

@dezso Đúng, nhưng họ sẽ miễn cưỡng loại bỏ chức năng tài liệu. Với chất lượng của tài liệu nói chung, tôi vẫn cho rằng thiếu sót của hành vi này là cố ý.
TREE

5

Tìm thấy một tài liệu tham khảo, trong phần Phục hồi không gian đĩa .

Nếu bạn có một bảng như vậy và bạn cần lấy lại dung lượng đĩa thừa mà nó chiếm, bạn sẽ cần sử dụng VACUUM FULL hoặc CLUSTER hoặc một trong các biến thể viết lại bảng của ALTER TABLE. Các lệnh này viết lại toàn bộ bản sao mới của bảng và xây dựng các chỉ mục mới cho nó.


-3

Phân tích tất cả các câu trả lời, theo tôi cách đúng đắn để làm điều đó là reindex TRƯỚC cụm. Vì tài liệu không cho biết cụm có làm hay không một reindex và chỉ một bản sao của chỉ mục, được đặt hàng hay không, tôi nghĩ rằng một chỉ mục được lập chỉ mục sẽ dẫn đến một bảng được phân nhóm tốt hơn. Sau đó, một phân tích sẽ hoàn thành công việc. Một khoảng trống đầy trước tất cả dường như là vô dụng, trừ khi cụm và / hoặc reindex không giải phóng các bộ dữ liệu chết


Như tôi đã đề cập trong câu trả lời được chấp nhận, các tài liệu không nói rằng các chỉ số sẽ được xây dựng lại, chỉ cần không phải trên trang về lệnh CỤM.
TREE

Và cả hai CLUSTERVACUUM FULLtạo ra một bảng vật lý hoàn toàn mới - đơn giản là không thể có bất kỳ cái chết nào sau nó. Không gian được sử dụng bởi bản sao cũ sẽ được giải phóng vào cuối hoạt động.
dezso

Thật. Nó tạo lại bảng và tất cả các chỉ mục. Nhưng tôi có nghi ngờ về chỉ mục mà Cluster sử dụng để sắp xếp lại bảng. Nó sẽ được giới thiệu lại trước hoặc sẽ được sử dụng để sắp xếp lại bảng như hiện tại? Và sau đó chỉ số được tạo lại? Bởi vì một chỉ số có vấn đề có thể tạo ra một số vấn đề ...
Aislan Luiz Wendling
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.