Um zu überprüfen, was CLUSTER
funktioniert, habe ich eine Tabelle aus einem früheren Experiment genommen, die im Grunde die ersten 10 Millionen positiven ganzen Zahlen enthielt. Ich habe bereits einige Zeilen gelöscht, und es gibt auch eine andere Spalte, die sich jedoch nur auf die tatsächliche Tabellengröße auswirkt. Das ist also nicht so interessant.
Nachdem ich VACUUM FULL
auf dem Tisch gelaufen war fka
, nahm ich seine Größe an:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Dann sehen wir uns die physikalische Reihenfolge der Daten vom Anfang der Tabelle an:
SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;
id | col1 | ctid
-----+------+---------
2 | 2 | (0,1)
3 | 3 | (0,2)
4 | 4 | (0,3)
5 | 5 | (0,4)
6 | 6 | (0,5)
Nun löschen wir einige Zeilen:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Danach hat sich die gemeldete Tabellengröße nicht geändert. Also mal sehen, was CLUSTER
macht:
CLUSTER fka USING fka_pkey;
SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;
id | col1 | ctid
-----+------+---------
2 | 2 | (0,1)
3 | 3 | (0,2)
4 | 4 | (0,3)
6 | 6 | (0,4)
7 | 7 | (0,5)
Nach der Operation änderte sich die Tabellengröße von 338 auf 296 MB. In der ctid
Spalte, die die physische Position des Tupels auf der Seite beschreibt, sehen Sie auch, dass es keine Lücke gibt, in der die Zeilenübereinstimmung stattgefunden hat id = 5
.
Da die Tupel neu angeordnet wurden, sollten Indizes neu erstellt werden, damit sie auf die richtigen Stellen verweisen.
Der Unterschied VACUUM FULL
scheint also zu sein, dass die Zeilen nicht sortiert werden. Soweit ich weiß, gibt es einige Unterschiede in dem Mechanismus, den die beiden Befehle verwenden, aber aus praktischer Sicht scheint dies der Hauptunterschied (nur?) Zu sein.