Uppdatering i PostgreSQL 9.2
Det var en stor förbättring, jag citerar releasekommentarerna här :
Originalt svar för PostgreSQL 9.1 eller äldre
En plpgsql-funktion har en liknande effekt som PREPARE
uttalande:frågor analyseras och frågeplanen cachelagras.
Fördelen är att viss overhead sparas för varje samtal.
Nackdelen är att frågeplanen inte är optimerad för de specifika parametervärden som den anropas med.
För frågor på tabeller med jämn datadistribution är detta i allmänhet inga problem och PL/pgSQL-funktioner kommer att fungera något snabbare än råa SQL-frågor eller SQL-funktioner. Men om din fråga kan använda vissa index beroende på de faktiska värdena i WHERE
eller, mer allmänt, valde en bättre frågeplan för de specifika värdena, kan du sluta med en suboptimal frågeplan. Prova en SQL-funktion eller använd dynamisk SQL med EXECUTE
för att tvinga en fråga att planeras om för varje samtal. Kan se ut så här:
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;
Redigera efter kommentar:
Om denna variant inte ändrar exekveringstiden måste det finnas andra faktorer som spelar in som du kanske har missat eller inte nämnt. En annan databas? Olika parametervärden? Du måste lägga upp mer information.
Jag lägger till ett citat från manualen för att backa upp mina ovanstående uttalanden: