Bahasa prosedural PostgreSQL - perbedaan antara PL / pgSQL dan SQL


20

Adakah yang bisa meringkas perbedaan antara:

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

dan

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

Poin utama:

  • perbedaan konsepsi
  • diberi masalah keluarga, kenyamanan penggunaan
  • isu-isu politik

1
Pertama, fungsi SQL (alias bahasa query) tidak melibatkan bahasa prosedural PostgreSQL. Kedua, Anda sudah menemukan sumber terbaik di mana orang dapat menemukan jawaban untuk pertanyaan Anda (dengan pengecualian yang terakhir - apa yang sebenarnya Anda lakukan dengan 'masalah politik'?)
dezso

Saya meminta untuk merangkum semua masalah utama, tidak harus menggunakan dokumentasi yang saya tempelkan, tetapi juga menggunakan kesan pribadi. Tautan tersebut ada di sana hanya untuk memastikan semua orang mengerti tentang apa pertanyaannya.
Gismo Ranas

Jangan menganggapnya sebagai penyerangan, tetapi begitu Anda telah membacanya, Anda dapat meringkasnya sendiri :) Jika tidak, pertanyaan Anda agak luas, tetapi dengan sedikit waktu saya akan mencoba mengumpulkan beberapa pemikiran.
dezso

1
Jangan abaikan bahasa prosedural lainnya. Khususnya PL / Perl sangat berguna untuk area di mana PL / PgSQL terlalu terbatas; PL / Pythonu melakukan pekerjaan jika Anda lebih suka Python tetapi tidak menawarkan model keamanan seperti PL / Perl. Ada juga PL / V8 (JavaScript) sebagai tambahan.
Craig Ringer

1
Hai cataldo - Saya hanya ingin menyambut Anda ke situs ini karena ini adalah pertanyaan pertama Anda di sini. Terima kasih telah memposting dan saya harap Anda tetap disini.
Jack Douglas

Jawaban:


27

PL / PgSQL dan fungsi SQL biasa keduanya merupakan bagian dari set alat yang lebih besar, dan harus dilihat dalam konteks itu. Saya cenderung memikirkannya dalam hal skala kekuatan naik yang disesuaikan dengan kompleksitas dan biaya, di mana Anda harus menggunakan alat paling sederhana yang akan melakukan pekerjaan dengan baik:

  • Gunakan tampilan jika memungkinkan
  • Jika tampilan tidak cocok, gunakan fungsi SQL
  • Di mana fungsi SQL tidak cocok, gunakan PL / PgSQL.
  • Jika PL / PgSQL terlalu terbatas atau tidak cukup ekspresif, gunakan PL / Perl, PL / Python, PL / V8, PL / Java, atau apa pun preferensi Anda
  • ... dan di mana tidak ada PL akan melakukan pekerjaan itu, gunakan program eksternal dan mungkin LISTENdan NOTIFYuntuk berbicara dengannya.

Sangat sering tampilan cukup ketika Anda berpikir suatu fungsi diperlukan. Bahkan jika itu sangat mahal untuk SELECTseluruh tampilan, WHEREklausa dalam permintaan referensi yang melihat biasanya didorong ke dalam tampilan dan dapat menghasilkan rencana permintaan yang sangat berbeda. Saya sering mengalami peningkatan kinerja besar dari mengubah fungsi SQL menjadi tampilan.

Saat utama Anda menemukan Anda tidak dapat menggunakan tampilan dan harus mempertimbangkan fungsi SQL adalah ketika:

  • WHEREDiperlukan parameter yang tidak bisa dinyatakan sebagai klausa sederhana , seperti parameter dalam WITHekspresi
  • Anda menginginkan penghalang keamanan melalui SECURITY DEFINERfungsi, dan security_barrierpandangan di PostgreSQL 9.2 dan di atasnya tidak cukup untuk kebutuhan Anda;
  • Anda memerlukan parameter yang tidak didorong ke sub-klausa tampilan oleh pengoptimal dan ingin mengontrolnya lebih langsung; atau
  • Ada banyak params atau ada banyak pengulangan params, jadi tidak praktis untuk menulis kueri sebagai tampilan.

Untuk sebagian besar tugas tersebut, fungsi SQL biasa berfungsi dengan baik, dan seringkali lebih mudah dibaca daripada PL / PgSQL. Fungsi SQL yang dideklarasikan STABLEatau IMMUTABLE(dan tidak juga dideklarasikan STRICTatau SECURITY DEFINER) juga dapat dimasukkan ke dalam pernyataan panggilan. Itu menghilangkan fungsi panggilan overhead dan kadang-kadang juga dapat menghasilkan manfaat kinerja yang besar ketika kondisi WHERE dalam fungsi panggilan akan didorong ke fungsi SQL oleh pengoptimal. Gunakan fungsi SQL setiap kali cukup untuk tugas tersebut.

Waktu utama fungsi SQL tidak akan melakukan pekerjaan adalah ketika Anda membutuhkan banyak logika. Jika / maka / selain itu operasi yang tidak dapat Anda ungkapkan sebagai CASEpernyataan, banyak menggunakan kembali hasil yang dihitung, membangun nilai dari potongan, penanganan kesalahan, dll. PL / PgSQL berguna saat itu. Pilih PL / PgSQL saat Anda tidak dapat menggunakan fungsi SQL atau cocok, seperti untuk:

  • SQL dinamis dan DDL dinamis melalui EXECUTEpernyataan
  • Saat Anda ingin RAISEkesalahan / peringatan untuk log atau klien
  • Saat Anda membutuhkan penanganan pengecualian - Anda dapat menjebak dan menangani kesalahan dengan EXCEPTIONblok alih-alih seluruh transaksi diakhiri karena kesalahan
  • Logika kondisional kompleks yang tidak cocok CASE ... WHENdengan sangat baik
  • Banyak penggunaan kembali nilai terhitung yang tidak dapat Anda lakukan WITHdan CTE
  • Membangun catatan dinamis
  • Anda perlu melakukan tindakan setelah menghasilkan set hasil

Dengan common table expressions (CTEs), terutama CTE yang dapat ditulis dan WITH RECURSIVEsaya merasa saya menggunakan PL / PgSQL jauh lebih sedikit daripada yang saya gunakan sebelumnya karena SQL jauh lebih ekspresif dan kuat. Saya menggunakan tampilan dan fungsi SQL biasa lebih banyak sekarang. Perlu diingat bahwa fungsi SQL biasa dapat berisi lebih dari satu pernyataan; pernyataan terakhir adalah hasil fungsi.


Sangat bagus! (tambahan walaupun virtual +1 untuk menyebutkan
CTE yang

Jawaban ini juga menjelaskan mengapa beberapa fungsi membutuhkan pagar pengoptimalan .
Eonil

8

plpgsqladalah bahasa prosedural lengkap, dengan variabel, konstruksi perulangan, dll. SQLFungsi hanyalah sebuah subquery. Sebuah fungsi SQL, jika dideklarasikan STABLEatau IMMUTABLEdan tidak juga menyatakan STRICT, sering dapat inline ke dalam query panggilan, seolah-olah itu ditulis pada setiap referensi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.