У меня есть таблица размером 200 ГБ, занятая данными, и размером 180 ГБ по 6 индексам. Он раздут на 30%, поэтому я хочу вернуть ненужное место, занимаемое им. Он сгруппирован по job_id_id
индексу х.
Итак, чтобы освободить место, мне нужно использовать cluster
команду или vacuum full
команду?
В чем разница между этими двумя командами?
Является ли
vacuum full
заказ по каким - то колонкам же , какcluster
команда?Индекс воссоздан в обеих командах?
В моем случае, какой из них будет быстрее?
Версия базы данных PostgreSQL - 9.1.
Ответы:
Чтобы проверить, что
CLUSTER
происходит, я взял таблицу из предыдущего эксперимента, которая в основном содержала первые 10 миллионов натуральных чисел. Я уже удалил некоторые строки, и есть другой столбец, но они влияют только на фактический размер таблицы, так что это не так интересно.Сначала, побежав
VACUUM FULL
по столуfka
, я взял его размер:Тогда давайте посмотрим физический порядок данных с самого начала таблицы:
Теперь давайте удалим несколько строк:
После этого указанный размер таблицы не изменился. Итак, давайте посмотрим теперь, что
CLUSTER
делает:После операции размер таблицы изменился с 338 до 296 МБ. Из
ctid
столбца, который описывает физическое место кортежа на странице, вы также видите, что нет места, гдеid = 5
раньше было соответствие строк .Поскольку кортежи были переупорядочены, индексы должны были быть воссозданы так, чтобы они указывали на правильные места.
Таким образом, разница выглядит не в том
VACUUM FULL
, что строки не упорядочены. Насколько я знаю, есть некоторые различия в механизме, который используют две команды, но с практической точки зрения это, кажется, основное (единственное?) Отличие.источник
ctid
колонка. Оказывается, это системный столбец, описывающий физическое местоположение строки в ее таблице. 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
также интересен: требуется повторное индексирование после кластера
Но, возможно, все, что вам нужно, - это простое,
REINDEX
которое перестраивает индекс, используя данные, хранящиеся в таблице индекса, заменяя старую копию индекса.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
источник