Untuk memeriksa apa yang CLUSTERterjadi, saya mengambil tabel untuk saya dari percobaan sebelumnya yang pada dasarnya berisi 10 juta bilangan bulat positif pertama. Saya sudah menghapus beberapa baris dan ada kolom lain juga tetapi ini hanya mempengaruhi ukuran tabel yang sebenarnya, jadi tidak begitu menarik.
Pertama, setelah berlari VACUUM FULLdi atas meja fka, saya mengambil ukurannya:
\dt+ fka
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+----------+--------+-------------
public | fka | table | test | 338 MB |
Lalu mari kita lihat urutan fisik data dari awal tabel:
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)
Sekarang mari kita hapus beberapa baris:
DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000
Setelah ini, ukuran tabel yang dilaporkan tidak berubah. Jadi mari kita lihat sekarang apa yang CLUSTERterjadi:
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)
Setelah operasi, ukuran tabel berubah dari 338 menjadi 296 MB. Dari ctidkolom, yang menggambarkan tempat fisik tuple di halaman, Anda juga melihat bahwa tidak ada celah di mana dulu baris yang cocok id = 5.
Saat tupel disusun ulang, indeks seharusnya dibuat ulang sehingga mengarah ke tempat yang benar.
Jadi perbedaannya terlihat bahwa VACUUM FULLtidak memesan baris. Sejauh yang saya tahu, ada beberapa perbedaan dalam mekanisme yang digunakan dua perintah tetapi dari sudut pandang praktis ini tampaknya menjadi perbedaan utama (hanya?).