Щоб перевірити, що 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
рядки не впорядковуються. Наскільки я знаю, є деяка різниця в механізмі, який обидві команди використовують, але з практичної точки зору це здається головною (єдиною?) Різницею.