Czy po CLUSTER wymagany jest REINDEX?

12

Rozważam użycie CLUSTER do zmiany kolejności tabeli według indeksu. Rozumiem, że to odtworzenie danych tabeli powoduje, że wszystkie istniejące indeksy stają się wzdęte lub stają się bezużyteczne. Widziałem pewne oznaki, że po klastrach wymagany jest REINDEX. Znalazłem inne referencje wskazujące, że CLUSTER wykonuje REINDEX. Dziennik Dokumentacja mówi nic o REINDEX bycia częścią klastra lub wymagane (choć sugeruje uruchomiony ANALYSE po klastrze)

Czy ktoś może definitywnie (tj. Z jakimś odniesieniem do oficjalnych dokumentów) powiedzieć, czy REINDEX jest wymagany po CLUSTER?

DRZEWO
źródło
2
Nie uważam, że to konieczne. clusterprzenosi wiersze, więc i tak będzie musiał zaktualizować informacje o indeksie.
a_horse_w_no_name
Tak, ale teoria w połowie dyskusji, które znalazłem, jest taka, że ​​powoduje to, że indeks się wzdycha.
DRZEWO

Odpowiedzi:

12

Nie musisz ponownie indeksować, ponieważ CLUSTERskutecznie robi to za Ciebie.

Mówiąc dokładniej, CLUSTERblokuje tabelę źródłową, a następnie tworzy nową jej kopię uporządkowaną zgodnie z indeksem docelowym. Tworzy indeksy na nowej kopii, a następnie zastępuje starą tabelę i indeksy na nowe.

Pamiętaj, że dotyczy to również wersji VACUUM FULL9.0+.

Jeśli widziałeś dyskusję sugerującą, że CLUSTERindeksy wzdęć mogą być ludzie, którzy zakładają, że CLUSTERdziała jak w wersji wcześniejszej niż 9.0 VACUUM FULL. Możesz także widzieć i błędnie czytać dyskusje, które wspominają o rozdęciu indeksu spowodowanym przez starą VACUUM FULLimplementację i sugerują CLUSTERjako alternatywę .

Jest to sugerowane w dokumentacji :

tworzona jest tymczasowa kopia tabeli, która zawiera dane tabeli w kolejności indeksu. Tworzone są również tymczasowe kopie każdego indeksu w tabeli . Dlatego potrzebujesz wolnego miejsca na dysku co najmniej równego sumie wielkości tabeli i rozmiarów indeksu

Nie mówi, ale powinien, że te tymczasowe kopie zastępują oryginalny stół . (Moja śmiała).

Craig Ringer
źródło
1
Czy masz jakieś odniesienia, że ​​CLUSTER zastępuje indeksy?
DRZEWO
1
@TREE Dodano. Dokumenty nie mówią wprost, że tymczasowa tabela i indeksy zastępują oryginały, ale zobaczysz, że tak jest, jeśli faktycznie spojrzysz na katalog danych przed / po CLUSTER lub jeśli zbadasz kod źródłowy.
Craig Ringer
Przetestowałem to i przynajmniej w moim scenariuszu testowym rozmiar pliku indeksu został zmniejszony. Ale to tylko jeden scenariusz i może istnieć wiele zmiennych, które wpływają na zachowanie (liczba indeksów, całkowity rozmiar na dysku itp.), Więc nie mogę ufać prostemu testowi.
DRZEWO
1
@TREE Aby uzyskać absolutną pewność zrozumienia zachowania we wszystkich możliwych okolicznościach, musisz przeczytać kod źródłowy. Wszystko, co mogę powiedzieć, że nie jestem świadomy każdej sytuacji, w której CLUSTERnie nie przepisać indeksów, a badania rzeczywistych plików w base/sposób oczywisty pokazują nowe relfilenodes. Wygląda na to, że martwisz się problemami, których jeszcze nie masz.
Craig Ringer
8

Mam na to nazwę: koń bez nazwy: nie trzeba ponownie tworzyć indeksów. Poza tym w CLUSTERdokumentacji nie ma wzmianki o tym, możemy również zapoznać się ze REINDEXstroną:

Istnieje kilka scenariuszy użycia REINDEX:

  • Indeks został uszkodzony i nie zawiera już prawidłowych danych. Chociaż teoretycznie nigdy nie powinno się to zdarzyć, w praktyce indeksy mogą ulec uszkodzeniu z powodu błędów oprogramowania lub awarii sprzętu. REINDEX zapewnia metodę odzyskiwania.

  • Indeks stał się „rozdęty”, ponieważ zawiera wiele pustych lub prawie pustych stron. Może się to zdarzyć w przypadku indeksów B-drzewa w PostgreSQL przy pewnych nietypowych wzorcach dostępu. REINDEX zapewnia sposób na zmniejszenie zużycia miejsca przez indeks poprzez napisanie nowej wersji indeksu bez martwych stron. Więcej informacji znajduje się w sekcji 23.2.

  • Zmieniłeś parametr pamięci (np. Współczynnik wypełnienia) dla indeksu i chcesz się upewnić, że zmiana weszła w życie w pełni.

  • Kompilacja indeksu z opcją CONCURRENTLY nie powiodła się, pozostawiając indeks „niepoprawny”. Takie indeksy są bezużyteczne, ale wygodnie jest użyć REINDEX do ich odbudowania. Zauważ, że REINDEX nie wykona kompilacji równoległej. Aby zbudować indeks bez zakłócania produkcji, należy upuścić indeks i ponownie uruchomić polecenie CREATE INDEX CONCURRENTLY.

Oczywiście CLUSTERnie mieści się w żadnym z tych przypadków.

I w CLUSTERdokumentach jest małe zdanie :

[podczas grupowania] Tworzone są również tymczasowe kopie każdego indeksu w tabeli.

Sugeruje to, że podobnie jak sama tabela, indeksy również są porządkowane podczas procesu - w ten sposób reindeksowanie jest bezużyteczne.

dezso
źródło
Sugestia z pewnością istnieje, a testowanie wydaje się to potwierdzać. Czułbym się lepiej, opierając się na tym zachowaniu, gdyby doktorzy stwierdzili, że indeksy zostały odtworzone (na stałe).
DRZEWO
2
Widzę tu rzeczy do poprawki do dokumentu. Podręcznik powinien być bardziej precyzyjny na temat odtwarzania indeksów.
Erwin Brandstetter,
W tym momencie podejrzewam, że deweloperzy nie chcą oficjalnie dokumentować tego zachowania, ponieważ nie chcą być trwale związani z tą implementacją.
DRZEWO
@TREE istnieje wiele zmian funkcji między wersjami, a dokumenty zmieniają się odpowiednio (głównie). Przypuszczalnie zmieniają się też specyfikacje :), więc nigdzie nie widzę remisu.
dezso
@dezso Prawda, ale niechętnie usuwają udokumentowane funkcje. Biorąc pod uwagę ogólnie jakość dokumentacji, nadal zakładam, że pominięcie tego zachowania jest celowe.
DRZEWO
5

Znaleziono odwołanie w sekcji Odzyskiwanie miejsca na dysku .

Jeśli masz taką tabelę i musisz odzyskać zajmowane przez nią miejsce na dysku, będziesz musiał użyć VACUUM FULL lub alternatywnie CLUSTER lub jednego z wariantów przepisywania tabel ALTER TABLE. Te polecenia przepisują całą nową kopię tabeli i budują dla niej nowe indeksy .

DRZEWO
źródło
-3

Analizując wszystkie odpowiedzi, moim zdaniem właściwym sposobem na to jest ponowne indeksowanie PRZED klastrami. Ponieważ dokumentacja nie mówi, czy klaster wykonuje reindeks, czy tylko kopia indeksu, uporządkowana czy nie, myślę, że indeksowany indeks da lepszą tabelę klastrową. Następnie analiza zakończy pracę. Próżnia pełna wydaje się bezużyteczna, chyba że klaster i / lub reindex nie zwalniają martwych krotek

Aislan Luiz Wendling
źródło
Jak wspomina w przyjętym odpowiedź, dokumentacja nie powiedzieć, że indeksy będą odbudowane, nie tylko na stronie o poleceniu klastra.
DRZEWO
I obie CLUSTERi VACUUM FULLdaje zupełnie nową tabelę fizyczną - tam po prostu nie może być martwy po niej. Przestrzeń zajęta przez starą kopię zostanie zwolniona do końca operacji.
dezso
W rzeczy samej. Odtwarza tabelę i wszystkie indeksy. Mam jednak wątpliwości co do indeksu używanego przez klaster do zmiany kolejności tabeli. Najpierw zostanie ponownie zindeksowany, czy też zostanie wykorzystany do zmiany kolejności tabeli? A po tym indeks jest odtwarzany? Ponieważ problematyczny indeks może powodować pewne problemy ...
Aislan Luiz Wendling,