Karena cara PostgreSQL menangani transaksi dan konkurensi, MVCC - Multi-Version Concurrency Control, Anda bisa mendapatkan mengasapi. Di PostgreSQL, ketika Anda melakukan UPDATE
atau DELETE
, baris tersebut sebenarnya tidak dihapus secara fisik. Untuk a DELETE
, itu hanya menandai baris sebagai tidak tersedia untuk transaksi di masa depan, dan untuk UPDATE
, di bawah kap itu digabungkan INSERT
maka DELETE
, di mana versi sebelumnya dari baris ditandai tidak tersedia.
Sementara data ditandai tidak tersedia, masih ada di sana, dan ruang tidak dapat digunakan. Untuk kemudian menandai ruang yang tersedia untuk digunakan oleh database, proses vakum perlu dilakukan di belakang operasi, dan menandai ruang yang tersedia untuk database untuk digunakan. Namun tidak dikembalikan ke sistem operasi. Itu hanya terjadi ketika tidak ada baris aktif di seluruh halaman, yang bisa tidak biasa di beberapa beban kerja. Ini bisa menjadi hal yang baik untuk beberapa beban kerja, karena Anda cukup memperbarui ruang pada halaman individual di dalam file data, tanpa perlu menambahkan file data tambahan.
Masalah muncul dengan mengasapi ketika ada terlalu banyak tuple mati versus tuple hidup. Berjalan bersama dan memeriksa semua bendera visibilitas membutuhkan waktu, dan memiliki lebih banyak file data untuk suatu hubungan menghasilkan tambahan IO yang tidak perlu. Kembung terutama terlihat pada indeks, yang juga dapat memiliki banyak tupel mati, kadang-kadang lebih dari tabel. Gembung dapat memperlambat pencarian dan pemindaian indeks, yang akan muncul dalam waktu kueri yang meningkat perlahan dan mengubah rencana kueri.
Anda dapat memulihkan ruang dengan menggunakan pg_reorg , pg_repack , CLUSTER
atau VACUUM FULL
. Ini akan melalui dan mengatur ulang file, memindahkan tupel dan mengatur ulang untuk memastikan bahwa tidak ada tupel mati, yang akan menghilangkan mengasapi.
Penggembungan juga dapat dikelola secara efisien dengan menyesuaikan VACUUM
pengaturan per tabel, yang menandai ruang tuple mati yang tersedia untuk digunakan kembali oleh kueri berikutnya.
Anda dapat menggunakan kueri di PostgreSQL Wiki terkait dengan Show Database Bloat dan Index Bloat untuk menentukan berapa banyak bloat yang Anda miliki, dan dari sana, lakukan sedikit analisis kinerja untuk melihat apakah Anda memiliki masalah dengan jumlah bloat yang Anda miliki di meja Anda .