Wird nach CLUSTER ein REINDEX benötigt?


12

Ich überlege, mit CLUSTER eine Tabelle nach einem Index neu anzuordnen. Ich verstehe, dass diese Neuerstellung der Tabellendaten dazu führt, dass alle vorhandenen Indizes entweder aufgebläht oder unbrauchbar werden. Ich habe einige Anzeichen dafür gesehen, dass nach einem CLUSTER ein REINDEX erforderlich ist. Ich habe andere Referenzen gefunden, die zeigen , dass CLUSTER tut ein REINDEX. Die offizielle Dokumentation sagt überhaupt nichts darüber aus, dass REINDEX Teil von CLUSTER ist oder benötigt wird (obwohl es ratsam ist, ANALYZE nach dem CLUSTER auszuführen).

Kann jemand definitiv sagen (dh mit irgendeiner Art von Referenz zu offiziellen Dokumenten), ob nach einem CLUSTER ein REINDEX erforderlich ist oder nicht?


2
Ich denke nicht, dass es notwendig ist. clusterVerschiebt die Zeilen, sodass die Indexinformationen trotzdem aktualisiert werden müssen.
a_horse_with_no_name 10.04.13

Ja, aber die Theorie in der Hälfte der Diskussionen, die ich gefunden habe, ist, dass dadurch der Index aufgebläht wird.
BAUM

Antworten:


12

Sie müssen nicht neu indizieren, da dies CLUSTEReffektiv für Sie erledigt wird.

Insbesondere CLUSTERsperrt die Quelltabelle dann erstellt eine neue Kopie davon nach dem Zielindex bestellt. Es erstellt Indizes für die neue Kopie und ersetzt dann die alte Tabelle und die Indizes durch die neuen.

Beachten Sie, dass dies auch für VACUUM FULL9.0+ gilt.

Wenn Sie Diskussionen gesehen haben, die darauf hindeuten, dass CLUSTERBloats Indizes sind, könnten es Leute sein, die davon ausgehen, dass dies CLUSTERwie vor 9.0 funktioniert VACUUM FULL. Möglicherweise werden auch Diskussionen angezeigt und falsch interpretiert, in denen aufgedunsener Index erwähnt wird, der durch die alte VACUUM FULLImplementierung verursacht wurde , und CLUSTERals Alternative vorgeschlagen .

Dies ist in der Dokumentation impliziert :

Es wird eine temporäre Kopie der Tabelle erstellt, die die Tabellendaten in der Indexreihenfolge enthält. Temporäre Kopien jedes Indexes in der Tabelle werden ebenfalls erstellt . Daher benötigen Sie freien Speicherplatz auf der Festplatte, der mindestens der Summe aus Tabellengröße und Indexgröße entspricht

Was es nicht sagt, sondern sollte, ist, dass diese temporären Kopien dann die Originaltabelle ersetzen . (Bold Mine).


1
Haben Sie eine Referenz, die CLUSTER Indizes ersetzt?
TREE

1
@ BAUM Hinzugefügt. In den Dokumenten wird nicht explizit angegeben, dass die temporäre Tabelle und die Indizes die Originale ersetzen, aber Sie werden feststellen, dass dies der Fall ist, wenn Sie sich das Datenverzeichnis vor / nach einem CLUSTER ansehen oder den Quellcode untersuchen.
Craig Ringer

Ich habe dies getestet und zumindest in meinem Testszenario wurde die Größe der Indexdatei reduziert. Dies ist jedoch nur ein Szenario, und es kann viele Variablen geben, die sich auf das Verhalten auswirken (Anzahl der Indizes, Gesamtgröße der Festplatte usw.), sodass ich einem einfachen Test nicht vertrauen kann.
TREE

1
@TREE Um das Verhalten unter allen Umständen mit absoluter Sicherheit zu verstehen, müssen Sie den Quellcode lesen. Alles , was ich Ihnen sagen kann ist , dass ich keine Kenntnis von einer Situation bin , in dem CLUSTERsich nicht die Indizes neu zu schreiben, und die Untersuchung der tatsächlichen Dateien in base/zeigen eindeutig neue relfilenodes. Anscheinend machen Sie sich Sorgen über Probleme, die Sie noch nicht haben.
Craig Ringer

8

Ich bin mit a_horse_with_no_name dazu: Sie müssen die Indizes nicht neu erstellen. Abgesehen davon, dass die CLUSTERDokumentation dies nicht erwähnt, können wir die REINDEXSeite auch weiter konsultieren :

Es gibt verschiedene Szenarien, in denen REINDEX verwendet werden kann:

  • Ein Index ist beschädigt und enthält keine gültigen Daten mehr. Obwohl dies theoretisch nie passieren sollte, können in der Praxis Indizes aufgrund von Softwarefehlern oder Hardwarefehlern beschädigt werden. REINDEX bietet eine Wiederherstellungsmethode.

  • Ein Index ist "aufgebläht", dh er enthält viele leere oder fast leere Seiten. Dies kann bei B-Tree-Indizes in PostgreSQL unter bestimmten ungewöhnlichen Zugriffsmustern auftreten. REINDEX bietet eine Möglichkeit, den Platzbedarf des Index zu reduzieren, indem eine neue Version des Index ohne tote Seiten geschrieben wird. Weitere Informationen finden Sie in Abschnitt 23.2.

  • Sie haben einen Speicherparameter (z. B. Füllfaktor) für einen Index geändert und möchten sicherstellen, dass die Änderung vollständig wirksam wird.

  • Eine Indexerstellung mit der Option CONCURRENTLY ist fehlgeschlagen und hat einen "ungültigen" Index hinterlassen. Solche Indizes sind nutzlos, aber es kann praktisch sein, sie mit REINDEX neu zu erstellen. Beachten Sie, dass REINDEX keine gleichzeitige Erstellung durchführt. Um den Index zu erstellen, ohne die Produktion zu beeinträchtigen, sollten Sie den Index löschen und den Befehl CREATE INDEX CONCURRENTLY erneut ausgeben.

Klar, CLUSTERfällt in keinen dieser Fälle.

Und es gibt einen kleinen Satz in den CLUSTERDokumenten:

[während des Clusters] Von jedem Index in der Tabelle werden auch temporäre Kopien erstellt.

Dies lässt darauf schließen, dass die Indizes ebenso wie die Tabelle selbst während des Vorgangs neu angeordnet werden - auf diese Weise wird die Neuindizierung unbrauchbar.


Der Vorschlag ist auf jeden Fall da, und Tests scheinen ihn zu bestätigen. Ich würde mich besser auf dieses Verhalten verlassen, wenn die Dokumentation tatsächlich angibt , dass Indizes (dauerhaft) neu erstellt wurden.
BAUM

2
Ich sehe hier Sachen für einen Doc-Patch. Das Handbuch sollte sich genauer mit der Neuerstellung von Indizes befassen.
Erwin Brandstetter

Mein Verdacht an dieser Stelle ist, dass die Entwickler dieses Verhalten nicht offiziell dokumentieren wollen, weil sie nicht dauerhaft an diese Implementierung gebunden sein wollen.
TREE

@TREE Es gibt viele Funktionsänderungen zwischen den Versionen und die Dokumente ändern sich (meistens) entsprechend. Vermutlich ändern sich auch die technischen Daten :), so dass ich nirgendwo ein Unentschieden sehe.
Dezso

@dezso Stimmt, aber sie werden nur ungern dokumentierte Funktionen entfernen. Angesichts der Qualität der Dokumentation im Allgemeinen gehe ich immer noch davon aus, dass das Auslassen dieses Verhaltens beabsichtigt ist.
TREE

5

Es wurde eine Referenz im Abschnitt " Wiederherstellen des Speicherplatzes " gefunden.

Wenn Sie eine solche Tabelle haben und den überschüssigen Speicherplatz, den sie belegt, zurückfordern müssen, müssen Sie VACUUM FULL oder alternativ CLUSTER oder eine der Tabellenumschreibungsvarianten von ALTER TABLE verwenden. Diese Befehle schreiben eine völlig neue Kopie der Tabelle neu und erstellen dafür neue Indizes .


-3

Wenn Sie alle Antworten analysieren, ist meiner Meinung nach der richtige Weg, dies zu tun, die Neuindizierung VOR dem Cluster. Da die Dokumentation nicht angibt, ob Cluster einen Neuindex durchführen oder nicht, und nur eine Kopie des Index, sortiert oder nicht, wird ein indexierter Index meiner Meinung nach zu einer besseren Cluster-Tabelle führen. Danach beendet eine Analyse den Job. Ein vor allen Dingen volles Vakuum scheint nutzlos zu sein, es sei denn, Cluster und / oder Reindex geben keine toten Tupel frei


Wie ich in der akzeptierten Antwort erwähnen, die Dokumentation nicht sagen , dass der Indizes neu erstellt werden, nur nicht auf der Seite über den CLUSTER - Befehl.
BAUM

Und beides CLUSTERund VACUUM FULLproduziert einen brandneuen physischen Tisch - es kann einfach keinen Toten danach geben. Der von der alten Kopie belegte Speicherplatz wird am Ende des Vorgangs freigegeben.
Dezso

Tatsächlich. Es erstellt die Tabelle und alle Indizes neu. Ich habe jedoch Zweifel an dem Index, mit dem der Cluster die Tabelle neu anordnet. Es wird zuerst neu indiziert oder wird verwendet, um die Tabelle so wie sie ist neu zu ordnen. Und danach wird der Index neu erstellt? Weil ein problematischer Index einige Probleme verursachen könnte ...
Aislan Luiz Wendling
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.