Overhead prosedural PostgreSQL overhead (plpython / plsql / pllua ...)

12

Saya mencoba mencari informasi tentang fungsi yang ditentukan pengguna PostgreSQL dalam kinerja bahasa prosedural untuk tugas waktu nyata.

  1. Bagaimana mereka dibandingkan dengan fungsi builtin?
  2. Apakah ada perbedaan (dalam overhead) bagaimana Postgres memanggil / mengelola fungsi plpython vs plpgsql vs pllua (Saya tertarik dengan sisi integrasi / konteks / transfer data Postgres, bukan VM itu sendiri)?
  3. Apakah konteksnya overhead yang besar? Bisakah saya menggunakannya untuk pemetaan data waktu nyata (misalkan 1000 pertanyaan)
  4. Apakah ada manfaat menulis fungsi yang ditentukan pengguna dalam plpgsql kemudian pg / bahasa lain? Pada dokumentasi mereka menyebutkan keuntungan, tapi saya pikir mereka berlaku untuk semua bahasa prosedural postgresql.

Temuan terkait:

Robert Zaremba
sumber

Jawaban:

13
  1. UDFs dalam bahasa yang ditafsirkan hampir selalu lebih lambat daripada UDFs yang ditulis dalam fungsi C atau built-in, semua hal lainnya sama.

  2. Setiap bahasa mengikat memiliki kode yang berbeda untuk menghubungkan PostgreSQL ke bahasa, dengan berbagai tingkat optimasi, berbagai cara melewati beberapa tipe data, dll. Jadi variasi pasti ada. Seharusnya tidak terlalu besar kecuali Anda melewati tipe data yang mendapat penanganan yang sangat berbeda oleh satu bahasa dari yang lain, misalnya satu meneruskan hstoresebagai string, dan yang lain mengubahnya menjadi dict.

  3. Tidak jelas apa "konteksnya". Bisakah Anda menggunakannya untuk "pemetaan data waktu nyata" ... yah, tergantung pada fungsi yang dilakukan dan apakah itu cukup cepat pada server yang sedang berjalan, untuk klien yang membutuhkan, dan untuk kebutuhan Anda. Berapa lama seutas tali? Tolok ukur.

  4. PL / PgSQL lebih mudah untuk ditulis, dan menawarkan akses yang lebih cepat ke SQL. Ini umumnya lebih baik ketika Anda perlu membungkus sedikit logika di sekitar banyak SQL. Ini sangat lambat untuk operasi matematika dan algoritma yang kompleks, jadi kode komputasi murni dalam PL / PgSQL harus dihindari sedapat mungkin mendukung C, atau bahasa prosedural yang lebih cepat.

Mempercepat ketika menerapkan kembali kode PL / PgSQL di C dapat bervariasi dari diabaikan hingga lebih dari 1000 kali. Itu semua tergantung pada apa yang sebenarnya dilakukan kode.

(Jenis multi-pertanyaan ini tidak cocok untuk Stack Exchange karena sulit untuk mendapatkan jawaban yang pasti)

Craig Ringer
sumber
Maksud saya maksud semua data yang perlu ditransfer bolak-balik ke lingkungan prosedural
Robert Zaremba
4

ini sulit dikatakan. itu benar-benar tergantung pada apa yang Anda lakukan. misalnya: PL / pgSQL sangat bagus jika Anda memiliki pernyataan SQL besar di dalamnya - itu benar-benar gila jika Anda mendapatkan semua jenis percabangan, manajemen substring dan semua itu.

Anda benar-benar harus menguji dari kasus ke kasus.

Hans-Jürgen Schönig
sumber
4

Apakah konteksnya overhead yang besar? Bisakah saya menggunakannya untuk pemetaan data waktu nyata (misalkan 1000 pertanyaan)

Kinerja tergantung pada perangkat keras dan kompleksitas fungsi Anda. Saya membuat alat yang dijalankan pada server 12-core kecil dan kartu FusionIO (total biaya € 10.000) dan melakukan sekitar 2.500 transaksi per detik dengan 20 pengguna secara bersamaan. Setiap transaksi memanggil 29 prosedur tersimpan untuk memproses data dan mengembalikan beberapa informasi yang berguna kepada klien. Beberapa fungsi hanya menjalankan satu query, yang lain beberapa query. Secara total, ini mengeksekusi sekitar 200000 INSERT, SELECT dan UPDATE pernyataan per detik.

Ini semua ditulis dalam PL / SQL, PL / pgSQL dan PL / PerlU. Dan saya cukup yakin sistem dapat berjalan lebih cepat ketika beberapa fungsi ditulis ulang dalam C.

Dalam alat ini, sebagian besar kinerja berasal dari kartu SSD. Pada disk tunggal yang berputar, kita tidak akan pernah mendapatkan kinerja ini. Drive SSD murah juga gagal, ia bekerja selama satu jam (karena caching raid-card) dan kemudian game berakhir. Kartu FusionIO itu mahal, tetapi investasi yang sangat bagus ketika Anda terikat IO.

Frank Heikens
sumber