Pour vérifier ce qui se CLUSTER
passe, j'ai pris un tableau pour le mien d'une expérience antérieure qui contenait essentiellement les 10 premiers millions d'entiers positifs. J'ai déjà supprimé certaines lignes et il y a une autre colonne également, mais celles-ci n'affectent que la taille réelle du tableau, donc ce n'est pas si intéressant.
D'abord, ayant couru VACUUM FULL
sur la table fka
, j'ai pris sa taille:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Voyons ensuite l'ordre physique des données depuis le tout début du tableau:
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)
Supprimons maintenant quelques lignes:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Après cela, la taille du tableau signalée n'a pas changé. Voyons maintenant ce qui CLUSTER
fait:
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)
Après l'opération, la taille de la table est passée de 338 à 296 Mo. Dans la ctid
colonne, qui décrit l'emplacement physique du tuple dans la page, vous voyez également qu'il n'y a pas d'espace où se trouvait la correspondance de ligne id = 5
.
Comme les tuples ont été réorganisés, les index auraient dû être recréés afin qu'ils pointent vers les bons endroits.
La différence semble donc VACUUM FULL
ne pas ordonner les lignes. Pour autant que je sache, il existe une certaine différence dans le mécanisme utilisé par les deux commandes, mais d'un point de vue pratique, cela semble être la principale différence (seulement?).