Opdatering i PostgreSQL 9.2
Der var en stor forbedring, jeg citerer udgivelsesbemærkningerne her :
Originalt svar for PostgreSQL 9.1 eller ældre
En plpgsql-funktion har en lignende effekt som PREPARE
sætning:forespørgsler parses, og forespørgselsplanen cachelagres.
Fordelen er, at der gemmes noget overhead for hvert opkald.
Ulempen er, at forespørgselsplanen ikke er optimeret til de særlige parameterværdier, den kaldes med.
For forespørgsler på tabeller med jævn datafordeling vil dette generelt ikke være noget problem, og PL/pgSQL-funktioner vil udføre noget hurtigere end rå SQL-forespørgsler eller SQL-funktioner. Men hvis din forespørgsel kan bruge visse indekser afhængigt af de faktiske værdier i WHERE
klausul eller mere generelt vælge en bedre forespørgselsplan for de særlige værdier, kan du ende med en suboptimal forespørgselsplan. Prøv en SQL-funktion, eller brug dynamisk SQL med EXECUTE
for at tvinge en forespørgsel til at blive omplanlagt for hvert opkald. Kunne se sådan ud:
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;
Rediger efter kommentar:
Hvis denne variant ikke ændrer på eksekveringstiden, må der være andre faktorer på spil, som du måske er gået glip af eller ikke har nævnt. En anden database? Forskellige parameterværdier? Du bliver nødt til at skrive flere detaljer.
Jeg tilføjer et citat fra manualen for at sikkerhedskopiere mine ovenstående udsagn: