PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché PostgreSQL tratta la mia query in modo diverso in una funzione?

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: