CLUSTER

Name

CLUSTER -- clustert eine Tabelle nach einem Index

Synopsis

CLUSTER indexname ON tabellenname

Beschreibung

Mit CLUSTER wird die in tabellenname angegebene Tabelle anhand des Index indexname geclustert. Der Index muss bereits existieren.

Wenn eine Tabelle geclustert wird, dann wird sie physikalisch anhand des Index umsortiert. Clustern ist eine einmalige Operation: Wenn die Tabelle später aktualisiert wird, dann werden die Änderungen nicht geclustert. Das heißt, es wird nicht versucht, die neuen oder aktualisierten Zeilen in der Indexreihenfolge einzuordnen. Wenn man es wünscht, dann kann man die Tabelle regelmäßig neu clustern, indem man den Befehl erneut ausführt.

Parameter

indexname

Der Name eines Index.

tabellenname

Der Name einer Tabelle (möglicherweise mit Schemaqualifikation).

Meldungen

CLUSTER

Die Operation wurde erfolgreich durchgeführt.

Hinweise

Wenn Sie in einer Tabelle nur auf einzelne, zufällig angeordnete Zeilen zugreifen, dann ist die tatsächliche Reihenfolge der Daten in der Tabelle unwichtig. Wenn Sie aber bestimmte Daten häufiger als andere verwenden und es einen Index gibt, der sie nebeneinander gruppiert, dann ist CLUSTER nützlich. Wenn Sie einen Bereich von indizierten Werten aus einer Tabelle auslesen oder ein indizierter Wert mehrere übereinstimmende Zeilen hat, dann hilft CLUSTER, denn wenn der Index die erste Heap-Seite der ersten übereinstimmenden Zeile gefunden hat, dann sind alle anderen übereinstimmenden Zeilen wahrscheinlich schon auf der selben Heap-Seite, und dadurch sparen Sie Festplattenzugriffe und beschleunigen die Anfrage.

Während des Cluster-Vorgangs wird eine temporäre Kopie der Tabelle gemacht, welche die Tabellendaten in der Indexreihenfolge enthält. Außerdem werden temporäre Kopien von jedem Index der Tabelle gemacht. Sie müssen daher mindestens so viel Platz frei haben, wie die Tabelle und die Indexe zusammen groß sind.

Weil der Planer Statistiken über die Sortierung von Tabellen speichert, ist es zu empfehlen, für jede neu geclusterte Tabelle ANALYZE auszuführen. Ansonsten könnte der Planer ungeeignete Anfragepläne auswählen.

Es gibt auch eine anderen Möglichkeit um Daten zu clustern. Mit dem Befehl CLUSTER wird anhand des angegebenen Index sortiert. Das kann bei großen Tabellen langsam sein, weil die Zeilen in der Indexreihenfolge aus dem Heap gelesen werden, und wenn die Heap-Tabelle unsortiert ist, dann sind die Einträge in zufällig verteilten Seiten und für jede zu verschiebende Zeile muss eine Diskseite gelesen werden. (PostgreSQL hat einen Cache, aber der Großteil einer großen Tabelle wird nicht in den Cache passen.) Die andere Möglichkeit um eine Tabelle zu clustern ist

CREATE TABLE neue_tabelle AS
    SELECT spaltenliste FROM tabelle ORDER BY spaltenliste;

was durch die ORDER BY-Klausel die Sortierroutinen von PostgreSQL verwendet; das ist normalerweise viel schneller als ein Indexscan durch unsortierte Daten. Danach löschen Sie die Tabelle, verwenden ALTER TABLE ... RENAME um neue_tabelle in den alten Namen umzubenennen und dann erzeugen Sie die Indexe der Tabelle neu. Bei diesem Vorgang gehen aber alle OIDs, Constraints, Fremdschlüsselverbindungen, Privilegien und andere Nebeneigenschaften der Tabelle verloren. All diese Sachen müssten Sie dann selbst neu erzeugen.

Beispiele

Clustere die Tabelle mitarbeiter anhand des Index mitarbeiter_ind:

CLUSTER mitarbeiter_ind ON mitarbeiter;

Kompatibilität

Der Befehl CLUSTER ist eine PostgreSQL-Erweiterung.