Чтобы проверить, что 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
, что строки не упорядочены. Насколько я знаю, есть некоторые различия в механизме, который используют две команды, но с практической точки зрения это, кажется, основное (единственное?) Отличие.