Bagian yang Paling Tidak Kami Sukai dari PostgreSQL
- PostgreSQL telah menjadi DBMS yang paling dicintai di internet selama lima tahun terakhir. Hal ini karena keandalan, kelengkapan fitur, skalabilitas, dan kesesuaiannya untuk sebagian besar beban kerja operasional.
- Namun, cara PostgreSQL mengimplementasikan multi-version concurrency control (MVCC) dinilai sebagai yang terburuk dibandingkan DBMS relasional lainnya.
Apa itu multi-version concurrency control?
- Tujuan MVCC adalah memungkinkan beberapa kueri membaca dan menulis basis data secara bersamaan tanpa saling mengganggu.
- DBMS tidak menimpa baris yang ada, melainkan mempertahankan beberapa versi sehingga kueri dapat memilih versi yang sesuai untuk memenuhi permintaan.
- Pendekatan ini menghilangkan kebutuhan akan penguncian rekaman secara eksplisit dan memungkinkan kueri mengamati snapshot basis data.
Multi-version concurrency control di PostgreSQL
- Saat memperbarui baris yang ada, PostgreSQL menggunakan metode penyimpanan versi append-only yang membuat versi baru untuk menerapkan perubahan.
- Pendekatan ini menimbulkan berbagai masalah yang kompleks.
Penyimpanan multi-versi
- PostgreSQL menyimpan semua versi baris di ruang penyimpanan yang sama.
- Saat pembaruan terjadi, PostgreSQL mengalokasikan slot versi baru, menyalin versi lama, lalu menerapkan perubahan.
- PostgreSQL menggunakan version chain untuk mencatat hubungan antarversi.
Vacuum versi
- PostgreSQL menggunakan prosedur vacuum untuk menghapus versi lama.
- Autovacuum berjalan secara berkala untuk menghapus versi yang kedaluwarsa dan menggunakan kembali ruang.
Mengapa MVCC PostgreSQL adalah yang terburuk
- Implementasi MVCC PostgreSQL berasal dari rancangan era 1980-an dan tidak cocok dengan pola sistem berstruktur log modern.
- Artikel ini menjelaskan empat masalah utama yang muncul dari MVCC PostgreSQL.
Masalah 1: Penyalinan versi
- PostgreSQL menyalin semua kolom ke versi baru sehingga meningkatkan duplikasi data dan kebutuhan penyimpanan.
- MySQL dan Oracle menghindari masalah ini dengan menyimpan delta.
Masalah 2: Pembengkakan tabel
- Versi PostgreSQL yang sudah kedaluwarsa tetap memakan ruang, dan jika autovacuum gagal membersihkannya, basis data akan terus membesar.
- Hal ini menurunkan performa kueri.
Masalah 3: Pemeliharaan indeks sekunder
- PostgreSQL harus memperbarui semua indeks pada setiap pembaruan.
- Hal ini menurunkan performa kueri.
Masalah 4: Pengelolaan vacuum
- Performa PostgreSQL sangat bergantung pada efektivitas autovacuum.
- Jika autovacuum tidak bekerja dengan baik, masalah performa akan muncul.
Ringkasan GN⁺
- PostgreSQL tetap merupakan DBMS yang sangat disukai, tetapi cara implementasi MVCC-nya tidak modern.
- Diperlukan banyak waktu dan upaya untuk menyelesaikan masalah MVCC PostgreSQL.
- Performa dapat ditingkatkan dengan mengoptimalkan pengaturan autovacuum PostgreSQL.
- Sebagai alternatif untuk mengatasi masalah MVCC PostgreSQL, MySQL dan Oracle dapat dipertimbangkan.
1 komentar
Opini Hacker News
OrioleDB mencoba menyelesaikan masalah dengan mesin penyimpanan baru
Desain PostgreSQL tidak buruk dalam segala hal
Implementasi MVCC di Oracle dan MySQL tidak menyimpan alamat fisik versi baru
Saat memperbarui satu baris di MySQL,
SELECT id WHERE something; UPDATE what WHERE id=idjauh lebih cepatPada 2010-an, MongoDB dipersepsikan sebagai "webscale" karena penulisan yang tidak durable
Tidak setuju dengan penjelasan tentang
pg_repackVACUUM FULLmemang berat, tetapi repack adalah alternatif yang lebih cepat dan lebih ringanAlasan PostgreSQL menjadi populer adalah sebagai berikut
Ada pertanyaan apakah penyimpanan seluruh versi row-tuple baru di PostgreSQL merupakan sifat dari mesin penyimpanan dasarnya
Artikelnya ditulis dengan baik sehingga mudah dibaca dan dipahami