Разница в PostgreSQL между VACUUM FULL и CLUSTER


13

У меня есть таблица размером 200 ГБ, занятая данными, и размером 180 ГБ по 6 индексам. Он раздут на 30%, поэтому я хочу вернуть ненужное место, занимаемое им. Он сгруппирован по job_id_idиндексу х.

Итак, чтобы освободить место, мне нужно использовать clusterкоманду или vacuum fullкоманду?

  1. В чем разница между этими двумя командами?

  2. Является ли vacuum fullзаказ по каким - то колонкам же , как clusterкоманда?

  3. Индекс воссоздан в обеих командах?

  4. В моем случае, какой из них будет быстрее?

Версия базы данных PostgreSQL - 9.1.


1
Да, индексы будут воссозданы. Я думаю, что быстрее, зависит от нескольких вещей. Но одно можно сказать наверняка: нет ничего лучше, чем «полный порядок вакуума по какой-то колонке».
Дезсо

1
Позвольте мне также упомянуть, что VACUUM не может работать внутри транзакции, что во многих случаях делает CLUSTER лучшей альтернативой (а иногда и единственной альтернативой), которая дает аналогичные результаты.
oᴉɹǝɥɔ

Ответы:


8

Чтобы проверить, что CLUSTERпроисходит, я взял таблицу из предыдущего эксперимента, которая в основном содержала первые 10 миллионов натуральных чисел. Я уже удалил некоторые строки, и есть другой столбец, но они влияют только на фактический размер таблицы, так что это не так интересно.

Сначала, побежав VACUUM FULLпо столу fka, я взял его размер:

\dt+ fka
                    List of relations
 Schema | Name | Type  |  Owner   |  Size  | Description 
--------+------+-------+----------+--------+-------------
 public | fka  | table | test     | 338 MB | 

Тогда давайте посмотрим физический порядок данных с самого начала таблицы:

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)

Теперь давайте удалим несколько строк:

DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000

После этого указанный размер таблицы не изменился. Итак, давайте посмотрим теперь, что CLUSTERделает:

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)

После операции размер таблицы изменился с 338 до 296 МБ. Из ctidстолбца, который описывает физическое место кортежа на странице, вы также видите, что нет места, где id = 5раньше было соответствие строк .

Поскольку кортежи были переупорядочены, индексы должны были быть воссозданы так, чтобы они указывали на правильные места.

Таким образом, разница выглядит не в том VACUUM FULL, что строки не упорядочены. Насколько я знаю, есть некоторые различия в механизме, который используют две команды, но с практической точки зрения это, кажется, основное (единственное?) Отличие.


Я не был уверен, что это за ctidколонка. Оказывается, это системный столбец, описывающий физическое местоположение строки в ее таблице. postgresql.org/docs/current/ddl-system-columns.html
Gajus

8

VACUUM FULLперезаписывает все содержимое таблицы в новый файл на диске без дополнительного места, позволяя вернуть неиспользуемое пространство операционной системе. Этот метод также требует дополнительного дискового пространства, так как он записывает новую копию таблицы и не освобождает старую копию до завершения операции. Обычно это следует использовать только в том случае, если из таблицы необходимо извлечь значительный объем пространства.

http://www.postgresql.org/docs/9.1/static/sql-vacuum.html

CLUSTERуказывает PostgreSQL кластеризовать таблицу, указанную в table_name, на основе индекса, указанного в index_name. Индекс должен быть уже определен для table_name. Когда таблица кластеризована, она физически переупорядочивается на основе информации индекса, и на нее устанавливается блокировка ACCESS EXCLUSIVE.

http://www.postgresql.org/docs/9.1/static/sql-cluster.html

также интересен: требуется повторное индексирование после кластера

Но, возможно, все, что вам нужно, - это простое, REINDEXкоторое перестраивает индекс, используя данные, хранящиеся в таблице индекса, заменяя старую копию индекса.

http://www.postgresql.org/docs/9.1/static/sql-reindex.html


1
Ого! Хороший совет о REINDEX тоже! Я сокращал несколько таблиц как VACUUM, так и CLUSTER (пытаясь сравнить время и последствия для этого в прямом эфире), и теперь мои самые большие объекты на самом деле являются индексами.
Майк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.