Adakah yang bisa menjelaskan perbedaan antara tipe-tipe ini VACUUM
di PostgreSQL?
Saya membaca dokumen tetapi hanya mengatakan bahwa FULL
mengunci tabel dan FREEZE
"membekukan" tuple. Saya pikir itu sama. Apakah aku salah?
Adakah yang bisa menjelaskan perbedaan antara tipe-tipe ini VACUUM
di PostgreSQL?
Saya membaca dokumen tetapi hanya mengatakan bahwa FULL
mengunci tabel dan FREEZE
"membekukan" tuple. Saya pikir itu sama. Apakah aku salah?
Jawaban:
Inilah jawaban singkat dan ringkas.
Vakum penuh mengeluarkan kunci eksklusif dan membangun kembali tabel sehingga tidak memiliki blok kosong (kami akan berpura-pura mengisi faktor 100% untuk saat ini).
Pembekuan vakum menandai isi tabel dengan stempel waktu transaksi yang sangat khusus yang memberi tahu postgres bahwa ia tidak perlu disedot selamanya. Pembaruan berikutnya id beku ini akan hilang.
Misalnya, database template0 dibekukan karena tidak pernah berubah (secara default Anda tidak dapat terhubung.)
Seringkali autemonacuum daemon akan memeriksa database dan tabelnya untuk melihat apa yang perlu disedot. Jika sebuah tabel dibekukan secara vakum dan kemudian tidak pernah diperbarui, daemon autovacuum hanya akan melewatinya. Juga perlindungan "membungkus" di postgresql tidak akan pernah menendang di meja itu juga.
tl; pembekuan menandai suatu tabel karena tidak memerlukan pemeliharaan autovac. Pembaruan berikutnya akan mencairkannya.
VACUUM FREEZE
memerlukan kunci eksklusif di atas meja? Sepertinya memang seharusnya begitu, jika tidak, Anda akan berisiko tiba-tiba membuat barisan dari transaksi aktif terlihat secara global. Saya mungkin salah paham ...
Untuk lebih jauh menjelaskan apa yang ditulis Jayadevan.
Cara Postgres bekerja dengan transaksi, dan untuk melacak data yang terlihat adalah dengan membandingkan ID Transaksi internal. Namun, karena transaksi tersebut adalah bilangan bulat 32-bit cepat atau lambat mereka akan membungkus, dan karena itu transaksi baru akan terlihat seperti itu dibuat di masa lalu (dan dengan demikian terlihat dalam transaksi saat ini sementara seharusnya tidak), sementara transaksi yang lebih lama akan terlihat seperti sedang dilakukan di masa depan (dan karena masa depan belum ada, data itu tidak akan terlihat lagi).
Apa yang dilakukan Postgres untuk mengatasi masalah itu adalah dengan menetapkan setiap baris yang cukup tua untuk beresiko menderita sampul ini, id transaksi khusus yang selalu lebih tua dari setiap transaksi. Anda bisa melihatnya seolah-olah id transaksi yang valid berkisar dari 0 hingga 2147483647, itu akan mengatur id transaksi untuk semua baris saat ini menjadi -1.
Namun, karena ruang hampa pada dasarnya untuk menandai ruang kosong untuk digunakan kembali, ini hanya berfungsi pada halaman data yang telah diubah.
Apa yang VACUUM FREEZE
dilakukan pada dasarnya adalah membekukan id transaksi untuk semua halaman tidak peduli apakah mereka telah dimodifikasi atau tidak, sehingga semua baris saat ini akan dianggap sebagai yang lama untuk semua transaksi baru.
Namun, pada versi 8.2 VACUUM FREEZE
telah usang dan tidak boleh digunakan. Sebaliknya ada parameter vacuum_freeze_table_age
dan autovacuum_freeze_max_age
yang menentukan berapa banyak transaksi yang dapat terjadi sebelum pemindaian lengkap dilakukan di atas meja (secara efektif melakukan internal VACUUM FREEZE
di atas meja).
VACUUM FREEZE
ia sudah tidak digunakan lagi?
Salin / tempel dari jawaban ketika saya mengajukan pertanyaan yang sama - "ruang hampa biasa menandai ruang kosong untuk digunakan kembali, dan mendapatkan kembali ruang kosong di akhir relasi. Jadi, jika ruang kosong ada di tengah dll, itu tidak bisa direklamasi hanya digunakan kembali.
vakum penuh memadatkan relasi yang mengambil kembali semua ruang kosong. Ini memerlukan kunci eksklusif dan buruk untuk sistem produksi pada umumnya karena ini.
Jadi tujuan vakum REGULAR bukan untuk merebut kembali ruang dari tabel tetapi untuk membuatnya tersedia untuk digunakan kembali nanti. Tujuan dari vakum LENGKAP adalah untuk memperoleh kembali semua ruang yang terbuang dengan mengorbankan kinerja kunci dan db eksklusif saat itu terjadi.
Jadi, karena ruang hampa biasa tidak dirancang untuk merebut kembali semua yang Anda tidak perlu terkejut bahwa itu tidak, pada kenyataannya, merebut kembali semuanya. Cobalah eksperimen Anda pada kumpulan data yang lebih besar dengan penghapusan yang lebih acak, dll, untuk melihat perbedaan antara vakum reguler dan vakum penuh. "
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Untuk menambah ini, vakum penuh sebenarnya akan membuat file baru untuk tabel (file yang sudah ada akan menyusut ke ukuran 0). Dengan demikian OS dapat merebut kembali ruang.
VACUUM FREEZE
khususnya.