Aggiornamento in PostgreSQL 9.2
C'è stato un notevole miglioramento, cito le note di rilascio qui :
Risposta originale per PostgreSQL 9.1 o precedenti
Una funzione plpgsql ha un effetto simile a PREPARE
istruzione:le query vengono analizzate e il piano delle query viene memorizzato nella cache.
Il vantaggio è che viene risparmiato un po' di sovraccarico per ogni chiamata.
Lo svantaggio è che il piano di query non è ottimizzato per i valori dei parametri particolari con cui viene chiamato.
Per le query su tabelle con distribuzione dei dati uniforme, questo non sarà generalmente un problema e le funzioni PL/pgSQL verranno eseguite in modo leggermente più rapido rispetto alle query SQL grezze o alle funzioni SQL. Ma se la tua query può utilizzare determinati indici a seconda dei valori effettivi in WHERE
clausola o, più in generale, ha scelto un piano di query migliore per determinati valori, potresti ritrovarti con un piano di query non ottimale. Prova una funzione SQL o usa SQL dinamico con EXECUTE
per forzare una nuova pianificazione della query per ogni chiamata. Potrebbe assomigliare a questo:
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;
Modifica dopo il commento:
Se questa variante non cambia il tempo di esecuzione, devono esserci altri fattori in gioco che potresti aver perso o non menzionato. Database diverso? Valori dei parametri diversi? Dovresti pubblicare più dettagli.
Aggiungo una citazione dal manuale per sostenere le mie affermazioni di cui sopra: