Ich habe eine Tabelle mit 200 GB Größe von Daten und 180 GB Größe von den 6 Indizes darauf besetzt. Es ist zu 30% aufgebläht, daher möchte ich unerwünschten Speicherplatz zurückfordern, der damit belegt ist. Es ist auf job_id_id
x-Index gruppiert .
Muss ich also cluster
Befehl oder vacuum full
Befehl verwenden , um den Speicherplatz freizugeben ?
Was ist der Unterschied zwischen diesen beiden Befehlen?
Entspricht die
vacuum full
Reihenfolge einer Spalte demcluster
Befehl?Wird der Index in beiden Befehlen neu erstellt?
In meinem Fall, welcher wird schneller sein?
Die Version der PostgreSQL-Datenbank ist 9.1
Antworten:
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 warfka
, nahm ich seine Größe an:Dann sehen wir uns die physikalische Reihenfolge der Daten vom Anfang der Tabelle an:
Nun löschen wir einige Zeilen:
Danach hat sich die gemeldete Tabellengröße nicht geändert. Also mal sehen, was
CLUSTER
macht: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 hatid = 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.quelle
ctid
Kolumne ist. Es stellt sich heraus, dass es sich um eine Systemspalte handelt, die den physischen Speicherort der Zeile in ihrer Tabelle beschreibt. postgresql.org/docs/current/ddl-system-columns.htmlhttp://www.postgresql.org/docs/9.1/static/sql-vacuum.html
http://www.postgresql.org/docs/9.1/static/sql-cluster.html
auch interessant: ist ein reindex erforderlich nach cluster
Möglicherweise benötigen Sie jedoch nur eine einfache
REINDEX
Methode, mit der ein Index anhand der in der Indextabelle gespeicherten Daten neu erstellt wird und die alte Kopie des Index ersetzt wird.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
quelle