Funkce SQL
... jsou lepší volbou:
-
Pro jednoduché skalární dotazy . Není moc co plánovat, raději si ušetříte režii.
-
Pro jediné (nebo velmi málo) hovory na relaci . Nic nezískáte z cachování plánu prostřednictvím připravených příkazů, které PL/pgSQL nabízí. Viz níže.
-
Pokud jsou obvykle volány v kontextu větších dotazů a jsou dostatečně jednoduché na to, aby byly vložené .
-
Pro nedostatek zkušeností s jakýmkoli procedurálním jazykem, jako je PL/pgSQL. Mnozí znají SQL dobře a to je asi vše, co potřebujete pro funkce SQL. Málokdo může říci totéž o PL/pgSQL. (I když je to docela jednoduché.)
-
Trochu kratší kód. Žádná bloková režie.
Funkce PL/pgSQL
... jsou lepší volbou:
-
Když potřebujete nějaké procedurální prvky nebo proměnné které samozřejmě nejsou dostupné ve funkcích SQL.
-
Pro jakýkoli druh dynamického SQL , kde vytvoříte a
EXECUTE
prohlášení dynamicky. Zvláštní pozornost je třeba věnovat tomu, aby se zabránilo vkládání SQL. Další podrobnosti:- Funkce Postgres vs. připravené dotazy
-
Když máte výpočty které lze znovu použít na několika místech a CTE nelze pro tento účel natáhnout. Ve funkci SQL nemáte proměnné a byli byste nuceni opakovaně počítat nebo zapisovat do tabulky. Tato související odpověď na dba.SE má vedle sebe příklady kódu pro řešení stejného problému pomocí funkce SQL / funkce plpgsql / dotazu s CTE:
- Jak předat parametr do funkce
Úkoly jsou poněkud dražší než v jiných procedurálních jazycích. Přizpůsobte styl programování, který nepoužívá více přiřazení, než je nutné.
-
Když funkci nelze vložit a je volána opakovaně. Na rozdíl od funkcí SQL lze plány dotazů ukládat do mezipaměti pro všechny příkazy SQL uvnitř funkcí PL/pgSQL; je s nimi zacházeno jako s připravenými prohlášeními , plán se uloží do mezipaměti pro opakovaná volání v rámci stejné relace (pokud Postgres očekává, že plán uložený v mezipaměti (obecný) bude pokaždé fungovat lépe než přeplánování. To je důvod, proč jsou funkce PL/pgSQL obvykle rychlejší v takových případech po prvních pár hovorech.
Zde je vlákno o výkonu pgsql, které diskutuje o některých z těchto položek:
- Re:funkce pl/pgsql předčí funkce SQL?
-
Když potřebujete zachytit chyby .
-
Pro spouštěcí funkce .
-
Při zahrnutí příkazů DDL změna objektů nebo změna systémových katalogů jakýmkoli způsobem relevantním pro následující příkazy - protože všechny příkazy ve funkcích SQL jsou analyzovány najednou, zatímco funkce PL/pgSQL plánují a provádějí každý příkaz postupně (jako připravený příkaz). Viz:
- Proč mohou mít funkce PL/pgSQL vedlejší efekt, zatímco funkce SQL nikoli?
Zvažte také:
- Výkon uložených procedur PostgreSQL
Chcete-li se skutečně vrátit z funkce PL/pgSQL můžete napsat:
CREATE FUNCTION f2(istr varchar)
RETURNS text AS
$func$
BEGIN
RETURN 'hello! '; -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;
Existují další způsoby:
- Mohu zajistit, aby funkce plpgsql vracela celé číslo bez použití proměnné?
- Příručka „Návrat z funkce“