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
LISTEN
dan NOTIFY
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 dalam WITH
ekspresi
- Anda menginginkan penghalang keamanan melalui
SECURITY DEFINER
fungsi, dan security_barrier
pandangan 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 STABLE
atau IMMUTABLE
(dan tidak juga dideklarasikan STRICT
atau 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 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:
- SQL dinamis dan DDL dinamis melalui
EXECUTE
pernyataan
- Saat Anda ingin
RAISE
kesalahan / peringatan untuk log atau klien
- Saat Anda membutuhkan penanganan pengecualian - Anda dapat menjebak dan menangani kesalahan dengan
EXCEPTION
blok alih-alih seluruh transaksi diakhiri karena kesalahan
- Logika kondisional kompleks yang tidak cocok
CASE ... WHEN
dengan sangat baik
- Banyak penggunaan kembali nilai terhitung yang tidak dapat Anda lakukan
WITH
dan CTE
- Membangun catatan dinamis
- Anda perlu melakukan tindakan setelah menghasilkan set hasil
Dengan 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.