4 poin oleh GN⁺ 2024-10-21 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2024-10-21
Opini Hacker News
  • OrioleDB mencoba menyelesaikan masalah dengan mesin penyimpanan baru

    • Jika operasi INSERT yang terutama dilakukan, tidak diperlukan ruang tambahan
    • Ada batasan pada jumlah pernyataan di dalam transaksi, tetapi ini bisa dihindari dengan menggunakan COPY FROM
    • Dari sudut pandang DBA, tidak perlu mengelola ruang rollback/undo secara terpisah
  • Desain PostgreSQL tidak buruk dalam segala hal

    • MySQL dan Oracle menyimpan delta terkompresi antara versi baru dan versi saat ini
    • git tidak menyimpan diff dan, mirip dengan PostgreSQL, menyimpan objek secara utuh
  • Implementasi MVCC di Oracle dan MySQL tidak menyimpan alamat fisik versi baru

    • Sebagai gantinya, keduanya menyimpan pengenal logis agar DBMS dapat menemukan alamat fisik versi saat ini
    • Hal ini dapat memperlambat pembacaan indeks sekunder, tetapi mengurangi overhead melalui keunggulan lain
  • Saat memperbarui satu baris di MySQL, SELECT id WHERE something; UPDATE what WHERE id=id jauh lebih cepat

    • Dalam pekerjaan umum, cara seperti ini tidak digunakan, dan ini membuat DML sekali jalan menjadi lebih lambat
  • Pada 2010-an, MongoDB dipersepsikan sebagai "webscale" karena penulisan yang tidak durable

    • Ini adalah hasil dari pemasaran
  • Tidak setuju dengan penjelasan tentang pg_repack

    • VACUUM FULL memang berat, tetapi repack adalah alternatif yang lebih cepat dan lebih ringan
  • Alasan PostgreSQL menjadi populer adalah sebagai berikut

    • Keamanan data, ACID, kemiripan dengan Oracle, MVCC, kepatuhan pada standar SQL, tim Postgres, komunitas, tipe data, performa tinggi, fleksibilitas BSD
    • PostgreSQL terus berkembang, dan komunitas memainkan peran besar
  • 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

    • Membantu memahami masalah terkait vacuum, dan diagramnya juga bagus