Para comprobar qué CLUSTERhace, tomé una tabla mía de un experimento anterior que básicamente contenía los primeros 10 millones de enteros positivos. Ya eliminé algunas filas y también hay otra columna, pero estas solo afectan el tamaño real de la tabla, por lo que no es tan interesante.
Primero, después de correr VACUUM FULLsobre la mesa fka, tomé su tamaño:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Luego, veamos el orden físico de los datos desde el comienzo de la tabla:
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)
Ahora eliminemos algunas filas:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Después de esto, el tamaño de la tabla informada no cambió. Entonces, veamos ahora qué CLUSTERhace:
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)
Después de la operación, el tamaño de la tabla cambió de 338 a 296 MB. En la ctidcolumna, que describe el lugar físico de la tupla en la página, también ve que no hay ningún espacio donde id = 5solía estar la coincidencia de filas .
A medida que se reordenaron las tuplas, los índices deberían haberse recreado para que apuntaran a los lugares correctos.
Entonces, la diferencia parece ser que VACUUM FULLno ordena las filas. Hasta donde yo sé, hay alguna diferencia en el mecanismo que usan los dos comandos, pero desde un punto de vista práctico, esta parece ser la principal (¿única?) Diferencia.