Pembaruan di PostgreSQL 9.2
Ada peningkatan besar, saya mengutip catatan rilis di sini :
Jawaban asli untuk PostgreSQL 9.1 atau lebih lama
Fungsi plpgsql memiliki efek yang mirip dengan PREPARE
pernyataan:kueri diuraikan dan rencana kueri di-cache.
Keuntungannya adalah beberapa overhead disimpan untuk setiap panggilan.
Kerugiannya adalah rencana kueri tidak dioptimalkan untuk nilai parameter tertentu yang dipanggil.
Untuk kueri pada tabel dengan distribusi data yang merata, ini umumnya tidak akan menjadi masalah dan fungsi PL/pgSQL akan bekerja lebih cepat daripada kueri SQL mentah atau fungsi SQL. Tetapi jika kueri Anda dapat menggunakan indeks tertentu tergantung pada nilai aktual di WHERE
klausa atau, lebih umum, memilih rencana kueri yang lebih baik untuk nilai tertentu, Anda mungkin berakhir dengan rencana kueri yang kurang optimal. Coba fungsi SQL atau gunakan SQL dinamis dengan EXECUTE
untuk memaksa kueri direncanakan ulang untuk setiap panggilan. Bisa terlihat seperti ini:
CREATE OR REPLACE FUNCTION pie(id_param integer)
RETURNS SETOF record AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM table_name
where id = $1'
USING id_param;
END
$BODY$
LANGUAGE plpgsql STABLE;
Edit setelah komentar:
Jika varian ini tidak mengubah waktu eksekusi, pasti ada faktor lain yang mungkin Anda lewatkan atau tidak sebutkan. Basis data yang berbeda? Nilai parameter yang berbeda? Anda harus memposting lebih banyak detail.
Saya menambahkan kutipan dari manual untuk mendukung pernyataan saya di atas: