Різниця в postgreSQL між VACUUM FULL і CLUSTER


13

У мене є таблиця з розміром 200 ГБ, зайнятою даними, і розміром 180 ГБ - 6 індексами. Він на 30% роздутий, тому я хочу повернути небажаний ним простір. Він кластеризований на job_id_idx індекс.

Тож, щоб повернути простір, чи потрібно мені використовувати clusterкоманду чи vacuum fullкоманду?

  1. Яка різниця між цими двома командами?

  2. Чи vacuum fullпорядок на якийсь стовпець збігається з clusterкомандою?

  3. Чи відтворено індекс в обох командах?

  4. У моєму випадку, хто з них буде швидшим?

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


1
Так, індекси будуть відтворені. Яке швидше залежить від кількох речей, я думаю. Але одне впевнене: немає нічого подібного до "повного замовлення вакуумом на якийсь стовпець".
dezso

1
Дозвольте також зазначити, що VACUUM не може виконувати транзакції, що в багатьох випадках робить CLUSTER кращою альтернативою (а іноді і єдиною альтернативою), яка дає подібні результати.
жовтня

Відповіді:


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-column.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

також зацікавлення: is-a-reindex-must-after-cluster

Але, можливо, все, що вам потрібно, це простий, REINDEXякий відновлює індекс за допомогою даних, що зберігаються в таблиці індексу, замінюючи стару копію індексу.

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


1
Вуа! Приємна порада і про REINDEX! Я скорочував кілька таблиць як VACUUM, так і CLUSTER (намагаючись порівняти часи та наслідки для цього Live), і тепер мої найбільші об'єкти - це фактично індекси.
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.