Para comprobar qué CLUSTER
hace, 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 FULL
sobre 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é CLUSTER
hace:
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 ctid
columna, que describe el lugar físico de la tupla en la página, también ve que no hay ningún espacio donde id = 5
solí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 FULL
no 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.