VACUUM FREEZE vs. VACUUM FULL


18

Adakah yang bisa menjelaskan perbedaan antara tipe-tipe ini VACUUMdi PostgreSQL?

Saya membaca dokumen tetapi hanya mengatakan bahwa FULLmengunci tabel dan FREEZE"membekukan" tuple. Saya pikir itu sama. Apakah aku salah?


Anda sudah membaca dokumen? Itu akan menjadi peluang yang sempurna untuk memasukkan tautan ke apa yang telah Anda baca ...
Erwin Brandstetter

Jawaban:


12

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.


Jadi, apakah VACUUM FREEZEmemerlukan 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 ...
Parthian Shot

Tidak ada pembekuan vakum, vakum penuh tidak.
Scott Marlowe

6

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 FREEZEdilakukan 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 FREEZEtelah usang dan tidak boleh digunakan. Sebaliknya ada parameter vacuum_freeze_table_agedan autovacuum_freeze_max_ageyang menentukan berapa banyak transaksi yang dapat terjadi sebelum pemindaian lengkap dilakukan di atas meja (secara efektif melakukan internal VACUUM FREEZEdi atas meja).


3
Bagaimana bisa dokumen itu tidak menyebutkan bahwa VACUUM FREEZEia sudah tidak digunakan lagi?
dezso

Menarik. Itu untuk versi antara 8.2 dan 9.0. Mungkin mereka menghapus penghinaan karena itu bisa menjadi fitur yang bagus untuk dimiliki.
Jimmy Stenke

1

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.


2
Pertanyaannya meminta VACUUM FREEZEkhususnya.
Erwin Brandstetter

Benar - "perbedaan antara jenis-jenis Vakum di PostgreSQL" - Saya pikir pertanyaannya adalah tentang perbedaan antara jenis-jenis vakum.
Jayadevan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.