Per verificare cosa CLUSTER
succede, ho preso un tavolo per il mio da un precedente esperimento che sostanzialmente conteneva i primi 10 milioni di numeri interi positivi. Ho già eliminato alcune righe e c'è anche un'altra colonna, ma queste influiscono solo sulla dimensione effettiva della tabella, quindi non è così interessante.
Innanzitutto, avendo eseguito VACUUM FULL
sul tavolo fka
, ho preso le sue dimensioni:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Quindi vediamo l'ordine fisico dei dati fin dall'inizio della tabella:
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)
Ora eliminiamo alcune righe:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Successivamente, la dimensione della tabella riportata non è cambiata. Vediamo ora cosa CLUSTER
fa:
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)
Dopo l'operazione, le dimensioni della tabella sono cambiate da 338 a 296 MB. Dalla ctid
colonna, che descrive la posizione fisica della tupla nella pagina, puoi anche vedere che non c'era spazio dove si trovava la corrispondenza delle righe id = 5
.
Man mano che le tuple venivano riordinate, gli indici avrebbero dovuto essere ricreati in modo che indichino i punti corretti.
Quindi la differenza sembra essere che VACUUM FULL
non ordina le righe. Per quanto ne so, esiste una certa differenza nel meccanismo utilizzato dai due comandi, ma dal punto di vista pratico questa sembra essere la differenza principale (unica?).