0Pricing
SQL Academy · Pelajaran

MVCC dan Penyebab Bloat

Pahami pengendalian konkurensi multiversi, alasan tuple mati menumpuk, dan cara transaksi panjang menyebabkan bloat

MVCC dan Penyebab Bloat adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Apa Itu MVCC?

Kontrol Konkurensi Multi-Versi. Alih-alih menggunakan penguncian, PostgreSQL menyimpan beberapa versi suatu baris. Pembaca melihat snapshot yang konsisten; penulis membuat versi baru tanpa memblokir pembaca.

Cara Kerja UPDATE

UPDATE tidak mengubah baris di tempat:

  1. Tandai versi baris lama sebagai "mati" pada transaksi T
  2. Tulis versi baru
  3. Transaksi lain melihat versi yang diizinkan oleh snapshotnya

Mengapa Terjadi Pembengkakan

Versi yang mati terus menumpuk. Tabel membesar meskipun jumlah barisnya tetap. Tanpa pembersihan, kueri secara bertahap memindai lebih banyak baris mati.

Saat VACUUM Mengambil Kembali Ruang

VACUUM menandai baris mati agar dapat digunakan kembali (di dalam berkas tabel). VACUUM TIDAK mengecilkan berkas kecuali berkas tersebut sepenuhnya kosong di bagian akhir. VACUUM FULL menulis ulang tabel — kunci eksklusif dan lambat.

VACUUM Otomatis

PostgreSQL menjalankan VACUUM otomatis di latar belakang. Proses ini dipicu ketika jumlah baris mati melewati ambang batas:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

Beban Kerja yang Menyebabkan Pembengkakan

  • Lalu lintas UPDATE yang tinggi pada tabel kecil / sibuk
  • Batch DELETE besar (memerlukan vacuum untuk membebaskan ruang)
  • Transaksi yang berjalan lama menghambat vacuum (menahan snapshot)
  • Sesi yang tidak aktif dalam transaksi menumpuk baris mati pada tabel yang sibuk

Mendiagnosis Pembengkakan

Ekstensi pgstattuple memberikan angka yang tepat:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

Transaksi Panjang Menghambat VACUUM

VACUUM hanya dapat membersihkan baris yang lebih lama daripada transaksi aktif tertua. Sesi yang tidak aktif dalam transaksi selama 4 jam berarti ada baris mati yang tidak dapat diklaim selama 4 jam.

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

Perlindungan dari Perputaran Ulang

ID transaksi berukuran 32 bit. Jika VACUUM otomatis tidak mampu mengimbanginya, klaster menghadapi "perputaran ulang" dan masuk ke mode keselamatan (VACUUM paksa). Pantau:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

Penghapusan Logis ≠ Fisik

DELETE menandai baris sebagai mati; ruangnya hanya dapat diambil kembali oleh VACUUM. DELETE massal yang tidak diikuti vacuum meninggalkan kumpulan besar baris mati.

Pembaruan HOT

Jika Anda hanya memperbarui kolom yang tidak diindeks dan tersedia ruang kosong pada halaman yang sama, PostgreSQL melakukan pembaruan HOT (Tuple Khusus Heap) — tanpa modifikasi indeks dan dengan pembengkakan yang lebih kecil.

Mengurangi Pembengkakan

  • Jaga transaksi tetap singkat
  • Hindari UPDATE lebar pada kolom yang diindeks (HOT tidak dapat diterapkan)
  • Sesuaikan pembersihan otomatis secara agresif pada tabel yang sering berubah
  • Gunakan pg_repack untuk menulis ulang tanpa kunci yang lama

Ringkasan

MVCC memungkinkan konkurensi dengan konsekuensi menumpuknya baris mati.

  • VACUUM membersihkan baris mati
  • Pembersihan otomatis sangat penting — jangan menonaktifkannya
  • Transaksi yang panjang menghambat pembersihan
  • Lakukan diagnosis dengan pgstattuple

Pemeriksaan Singkat

Mengapa UPDATE tidak mengecilkan tabel meskipun hanya satu kolom yang berubah?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “MVCC dan Penyebab Bloat” gratis?

Ya — teks lengkap “MVCC dan Penyebab Bloat” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “MVCC dan Penyebab Bloat”?

Pahami pengendalian konkurensi multiversi, alasan tuple mati menumpuk, dan cara transaksi panjang menyebabkan bloat Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “MVCC dan Penyebab Bloat” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. MVCC dan Penyebab Bloat
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE dan pg_statistic
  4. Pemindaian Hanya-Indeks dan Peta Visibilitas
← Kembali ke SQL Academy