Saya memiliki tabel dengan ukuran 200 GB yang ditempati oleh data dan ukuran 180 GB dengan 6 indeks di atasnya. Ini 30% kembung, jadi saya ingin merebut kembali ruang yang tidak diinginkan yang ditempati olehnya. Itu dikelompokkan pada job_id_id
indeks x.
Jadi untuk mendapatkan kembali ruang apakah saya perlu menggunakan cluster
perintah atau vacuum full
perintah?
Apa perbedaan antara kedua perintah ini?
Apakah
vacuum full
pesanan berdasarkan beberapa kolom sama dengancluster
perintah?Apakah indeks dibuat kembali di kedua perintah?
Dalam kasus saya yang mana yang akan lebih cepat?
Versi database PostgreSQL adalah 9.1
Jawaban:
Untuk memeriksa apa yang
CLUSTER
terjadi, 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 FULL
di atas mejafka
, saya mengambil ukurannya:Lalu mari kita lihat urutan fisik data dari awal tabel:
Sekarang mari kita hapus beberapa baris:
Setelah ini, ukuran tabel yang dilaporkan tidak berubah. Jadi mari kita lihat sekarang apa yang
CLUSTER
terjadi:Setelah operasi, ukuran tabel berubah dari 338 menjadi 296 MB. Dari
ctid
kolom, yang menggambarkan tempat fisik tuple di halaman, Anda juga melihat bahwa tidak ada celah di mana dulu baris yang cocokid = 5
.Saat tupel disusun ulang, indeks seharusnya dibuat ulang sehingga mengarah ke tempat yang benar.
Jadi perbedaannya terlihat bahwa
VACUUM FULL
tidak 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?).sumber
ctid
kolomnya. Ternyata itu adalah kolom sistem yang menggambarkan lokasi fisik baris dalam tabelnya. postgresql.org/docs/current/ddl-system-columns.htmlhttp://www.postgresql.org/docs/9.1/static/sql-vacuum.html
http://www.postgresql.org/docs/9.1/static/sql-cluster.html
juga intresting: is-a-reindex-required-after-cluster
Tapi mungkin yang Anda butuhkan adalah sederhana
REINDEX
yang membangun kembali indeks menggunakan data yang disimpan dalam tabel indeks, menggantikan salinan lama indeks.http://www.postgresql.org/docs/9.1/static/sql-reindex.html
sumber