Aktualizace v PostgreSQL 9.2
Došlo k zásadnímu zlepšení, cituji poznámky k vydání zde :
Původní odpověď pro PostgreSQL 9.1 nebo starší
Funkce plpgsql má podobný účinek jako PREPARE
příkaz:dotazy jsou analyzovány a plán dotazů je uložen do mezipaměti.
Výhodou je, že se u každého volání ušetří určitá režie.
Nevýhodou je, že plán dotazů není optimalizován pro konkrétní hodnoty parametrů, se kterými je volán.
U dotazů na tabulky s rovnoměrnou distribucí dat to obecně nebude žádný problém a funkce PL/pgSQL budou fungovat poněkud rychleji než nezpracované dotazy SQL nebo funkce SQL. Ale pokud váš dotaz může používat určité indexy v závislosti na skutečných hodnotách v WHERE
klauzuli nebo obecněji zvolili lepší plán dotazů pro konkrétní hodnoty, můžete skončit se suboptimálním plánem dotazů. Vyzkoušejte funkci SQL nebo použijte dynamické SQL s EXECUTE
vynutit přeplánování dotazu pro každé volání. Mohlo by to vypadat takto:
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;
Upravit po komentáři:
Pokud tato varianta nezmění dobu provedení, musí být ve hře další faktory, které jste možná přehlédli nebo jste je nezmínili. Jiná databáze? Různé hodnoty parametrů? Budete muset zveřejnit další podrobnosti.
Přidávám citát z manuálu pro zálohování mých výše uvedených tvrzení: