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
postgresql
stored-procedures
plpgsql
Gismo Ranas
sumber
sumber
Jawaban:
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:
LISTEN
danNOTIFY
untuk berbicara dengannya.Sangat sering tampilan cukup ketika Anda berpikir suatu fungsi diperlukan. Bahkan jika itu sangat mahal untuk
SELECT
seluruh tampilan,WHERE
klausa 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:
WHERE
Diperlukan parameter yang tidak bisa dinyatakan sebagai klausa sederhana , seperti parameter dalamWITH
ekspresiSECURITY DEFINER
fungsi, dansecurity_barrier
pandangan di PostgreSQL 9.2 dan di atasnya tidak cukup untuk kebutuhan Anda;Untuk sebagian besar tugas tersebut, fungsi SQL biasa berfungsi dengan baik, dan seringkali lebih mudah dibaca daripada PL / PgSQL. Fungsi SQL yang dideklarasikan
STABLE
atauIMMUTABLE
(dan tidak juga dideklarasikanSTRICT
atauSECURITY 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
CASE
pernyataan, 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:EXECUTE
pernyataanRAISE
kesalahan / peringatan untuk log atau klienEXCEPTION
blok alih-alih seluruh transaksi diakhiri karena kesalahanCASE ... WHEN
dengan sangat baikWITH
dan CTEDengan common table expressions (CTEs), terutama CTE yang dapat ditulis dan
WITH RECURSIVE
saya 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.sumber
plpgsql
adalah bahasa prosedural lengkap, dengan variabel, konstruksi perulangan, dll.SQL
Fungsi hanyalah sebuah subquery. Sebuah fungsi SQL, jika dideklarasikanSTABLE
atauIMMUTABLE
dan tidak juga menyatakanSTRICT
, sering dapat inline ke dalam query panggilan, seolah-olah itu ditulis pada setiap referensi.sumber