Mam tabelę z 200 GB wielkości zajmowaną przez dane i 180 GB wielkości przez 6 indeksów na niej. Jest nadęty w 30%, więc chcę odzyskać zajmowane przez niego niechciane miejsce. Jest skupiony na job_id_id
indeksie x.
Czy więc, aby odzyskać miejsce, muszę użyć cluster
polecenia lub vacuum full
polecenia?
Jaka jest różnica między tymi dwoma poleceniami?
Czy
vacuum full
kolejność według jakiejś kolumny jest taka sama jakcluster
polecenie?Czy indeks jest odtwarzany w obu poleceniach?
W moim przypadku który będzie szybszy?
Wersja bazy danych PostgreSQL to 9.1
Odpowiedzi:
Aby to sprawdzić
CLUSTER
, wziąłem tabelę z mojego wcześniejszego eksperymentu, która zawierała pierwsze 10 milionów dodatnich liczb całkowitych. Usunąłem już niektóre wiersze i jest też inna kolumna, ale wpływają one tylko na rzeczywisty rozmiar tabeli, więc nie jest to takie interesujące.Po pierwsze, po uruchomieniu
VACUUM FULL
na stolefka
, wziąłem jego rozmiar:Zobaczmy więc fizyczną kolejność danych od samego początku tabeli:
Teraz usuńmy niektóre wiersze:
Po tym raportowany rozmiar tabeli nie zmienił się. Zobaczmy teraz, co
CLUSTER
robi:Po operacji rozmiar tabeli zmienił się z 338 na 296 MB. Z
ctid
kolumny, która opisuje fizyczne miejsce krotki na stronie, widać również, że nie ma przerwy w miejscu, w którymid = 5
kiedyś było dopasowanie wierszy .Po zmianie kolejności krotek indeksy powinny zostać odtworzone, aby wskazywały właściwe miejsca.
Różnica wygląda na to, że
VACUUM FULL
nie porządkuje wierszy. O ile mi wiadomo, istnieje pewna różnica w mechanizmie używanym przez te dwa polecenia, ale z praktycznego punktu widzenia wydaje się, że jest to główna (jedyna?) Różnica.źródło
ctid
kolumna. Okazuje się, że jest to kolumna systemowa opisująca fizyczną lokalizację wiersza w tabeli. 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
również ciekawe: is-a-reindex-Required-after-cluster
Ale może wszystko, czego potrzebujesz, to prosta,
REINDEX
która odbudowuje indeks na podstawie danych przechowywanych w tabeli indeksu, zastępując starą kopię indeksu.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
źródło