sql >> Databáze >  >> RDS >> PostgreSQL

Proč PostgreSQL zachází s mým dotazem ve funkci jinak?

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í:




  1. Problém s vyrovnávací pamětí MySqlDataReader GetBytes...

  2. Jaký je nejlepší způsob migrace Django DB z SQLite do MySQL?

  3. Jak získat první řádek na skupinu v PostgreSQL

  4. Nelze zrušit tabulku MySQL kvůli omezením cizích klíčů