Para verificar o que CLUSTER
aconteceu, tirei uma tabela da minha de um experimento anterior que continha basicamente os primeiros 10 milhões de números inteiros positivos. Eu já excluí algumas linhas e também existe uma outra coluna, mas elas afetam apenas o tamanho real da tabela, portanto não é tão interessante.
Primeiro, tendo corrido VACUUM FULL
sobre a mesa fka
, tomei seu tamanho:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Então vamos ver a ordem física dos dados desde o início da tabela:
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)
Agora vamos excluir algumas linhas:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Depois disso, o tamanho da tabela relatada não foi alterado. Então, vamos ver agora o que CLUSTER
faz:
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)
Após a operação, o tamanho da tabela mudou de 338 para 296 MB. Na ctid
coluna, que descreve o local físico da tupla na página, você também vê que não há espaços onde a correspondência de linha id = 5
costumava estar.
À medida que as tuplas foram reordenadas, os índices deveriam ter sido recriados para que apontassem para os locais corretos.
Portanto, parece que a diferença é que VACUUM FULL
não ordena as linhas. Até onde eu sei, há alguma diferença no mecanismo que os dois comandos usam, mas, do ponto de vista prático, essa parece ser a principal (apenas?) Diferença.