Saya mengelola database besar (beberapa pertunjukan) yang berisi tabel dengan berbagai peran, beberapa dari mereka memegang jutaan catatan. Beberapa tabel hanya menerima sejumlah besar sisipan dan penghapusan, beberapa sisipan lainnya dan sejumlah besar pembaruan.
Basis data berjalan pada PostgreSQL 8.4 pada sistem Debian 6.0 amd64 dengan RAM 16 gigabytes.
Pertanyaannya adalah kadang-kadang proses autovacuum di atas meja, membutuhkan waktu sangat lama (hari) untuk menyelesaikannya. Saya ingin mengetahui secara kasar berapa banyak waktu yang dibutuhkan oleh perintah vakum tertentu, untuk dapat memutuskan apakah akan membatalkannya atau tidak. Juga jika ada indikator kemajuan untuk operasi vakum postgres, itu akan sangat membantu.
Edit:
Saya tidak mencari solusi anti peluru. Hanya petunjuk kasar tentang jumlah tupel mati atau byte I / O yang diperlukan sudah cukup untuk memutuskan. Sangat menyebalkan tidak memiliki petunjuk kapan VACUUM
akan selesai, apa pun.
Saya telah melihat bahwa pg_catalog.pg_stat_all_tables
memiliki kolom untuk jumlah tupel mati. Jadi adalah mungkin untuk memiliki estimasi, bahkan jika itu berarti kita harus ke ANALYZE
tabel sebelumnya. Di sisi lain, autovacuum_vacuum_threshold
dan autovacuum_vacuum_scale_factor
pengaturan sendiri membuktikan bahwa postgres sendiri tahu sesuatu tentang jumlah perubahan pada tabel dan mungkin menempatkannya di tangan DBA juga.
Saya tidak yakin permintaan apa yang harus dijalankan, karena ketika saya menjalankan VACUUM VERBOSE
, saya melihat bahwa tidak hanya tabel, tetapi indeks juga sedang diproses.
sumber
VACUUM FULL
pada 9.0+, karena sepenuhnya menulis ulang tabel. Ini seharusnya bekerja secara teraturVACUUM
juga, tetapi saya belum mengujinya. Untukautovacuum
itu akan berhasil jika Anda dapat menangkap proses pekerja autovacuum di atas meja, tapi saya tidak tahu bagaimana mencapainya.Ini sangat sulit ditentukan. Anda dapat menyetel autovacuuming menjadi lebih agresif atau lebih ringan. Tetapi ketika diatur ke ringan dan tertinggal di belakang dan beban I / O dasar terlalu tinggi, bisa terjadi bahwa ia tidak pernah mencapai kondisi hampa udara yang tepat - maka Anda melihat proses berjalan dan berjalan dan berjalan. Selain itu, edisi PostreSQL yang lebih baru memiliki kemampuan autovacuum yang jauh lebih baik, ini saja mungkin cukup untuk berpindah ke salah satunya (lebih disukai 9,2 sebagai yang terbaru).
Bilah kemajuan kedengarannya ide yang bagus tapi saya membayangkan itu tidak mudah untuk diimplementasikan secara bermakna. Karena Anda memiliki beban konstan pada tabel Anda, sangat mungkin bahwa kemajuan tampaknya mundur (maksud saya bahwa jumlah deadline / persentase meningkat bukannya menurun) - lalu kesimpulan apa yang Anda ambil?
sumber
VACUUM ANALYZE VERBOSE
setidaknya mencetak beberapa aktivitas ke konsol seperti halnya itu. Lebih baik daripada hanya menatap prompt statis bertanya-tanya apakah ada yang macet selama berjam-jam.VACUUM
, bukan autovacuum, tapi tetap saja sesuatu.Dalam produksi kami, salah satu tabel terbesar memiliki log ini:
Sejauh ini konsumsi sumber daya terburuk, semua tabel lainnya hanya memakan waktu kurang dari 2 detik.
Untuk melihat jenis-jenis log ini, Anda harus menjalankan ini:
(selama 5 ms), muat ulang file konfigurasi.
sumber
Saya menemukan posting ini dan posting ini bermanfaat, tetapi seperti yang lain telah disebutkan, mungkin sulit untuk menghitung kemajuan vakum secara keseluruhan, karena prosesnya melibatkan beberapa operasi terpisah.
Saya menggunakan kueri ini untuk memantau kemajuan pemindaian tabel vakum, yang tampaknya merupakan bagian terbesar dari pekerjaan:
Namun, ini tidak akan mencakup pemindaian indeks, yang terjadi setelahnya, dan dapat memakan waktu, jika tidak lebih lama, jika Anda memiliki satu ton indeks. Sayangnya, saya tidak dapat menemukan cara untuk memantau pemindaian indeks / penyedotan.
sumber