Bijwerken in PostgreSQL 9.2
Er was een grote verbetering, ik citeer de release-opmerkingen hier :
Oorspronkelijk antwoord voor PostgreSQL 9.1 of ouder
Een plpgsql-functie heeft een soortgelijk effect als de PREPARE
statement:query's worden geparseerd en het queryplan wordt in de cache opgeslagen.
Het voordeel is dat er voor elke aanroep wat overhead wordt bespaard.
Het nadeel is dat het queryplan niet is geoptimaliseerd voor de specifieke parameterwaarden waarmee het wordt aangeroepen.
Voor queries op tabellen met een gelijkmatige datadistributie zal dit over het algemeen geen probleem zijn en zullen PL/pgSQL-functies iets sneller werken dan onbewerkte SQL-query's of SQL-functies. Maar als uw zoekopdracht bepaalde indexen kan gebruiken, afhankelijk van de werkelijke waarden in de WHERE
clausule of, meer in het algemeen, een beter queryplan voor de specifieke waarden kiest, kunt u eindigen met een suboptimaal queryplan. Probeer een SQL-functie of gebruik dynamische SQL met EXECUTE
om te forceren dat de query opnieuw moet worden gepland voor elke oproep. Zou er zo uit kunnen zien:
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;
Bewerken na opmerking:
Als deze variant de uitvoeringstijd niet verandert, moeten er andere factoren in het spel zijn die je misschien hebt gemist of niet hebt vermeld. Andere databank? Verschillende parameterwaarden? Je zou meer details moeten posten.
Ik voeg een citaat toe uit de handleiding om mijn bovenstaande uitspraken te onderbouwen: