Pagi-pagi sekali setiap hari pekerjaan pgAgent menyegarkan isi tabel A dari tabel B pada database PostgreSQL 8.4 saya. Tabel A berisi sekitar 140 ribu catatan di 91 kolom dan memiliki dua indeks - satu sebagai bagian dari PRIMARY KEY dan yang lainnya indeks GIST pada kolom geometri POINT PostGIS.
Untuk membuat proses berjalan sedikit lebih cepat, pekerjaan menjatuhkan indeks pada kolom geometri, sebelum menghapus catatan dalam tabel A dan memasukkan catatan dari tabel B, kemudian indeks dibuat kembali. Ini semua dilakukan daemon autovacuum bekerja ketika terasa seperti itu (setelah sepuluh menit atau lebih dari membandingkan statistik pekerjaan dan statistik tabel untuk waktu penyelesaian pekerjaan dan waktu menjalankan autovacuum).
Setelah memeriksa meja pagi ini setelah semua ini terjadi, statistik tabel mengatakan kepada saya ukuran meja 272MB, ukuran tabel TOAST adalah 8192bytes, dan ukuran indeks 23MB. Ini tampak cukup besar sehingga saya mengeluarkan perintah REINDEX di atas meja dan ukuran indeks turun ke 9832kB.
Pertanyaan saya adalah ini:
Mengapa REINDEX ternyata mengurangi ukuran indeks begitu banyak ketika indeks (atau setidaknya indeks kolom geometri) telah dibuat lagi dari awal? Haruskah saya memastikan bahwa tabel telah disedot / dianalisis sebelum indeks dibangun? Bukankah menjatuhkan indeks pada kunci primer merupakan faktor dalam hal ini? Apa yang saya lewatkan?
ANALYZE
ukuran yang dilaporkan juga berkurang.