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

Nelze zrušit dočasnou tabulku ve funkci Postgres:je používána aktivními dotazy v této relaci

Chybová zpráva je poměrně zřejmá, nemůžete zrušit dočasnou tabulku, když je používána.

Problému se můžete vyhnout přidáním ON COMMIT DROP :

To však může být pravděpodobně jednodušší. Pokud nepotřebujete všechny ty dočasné tabulky pro začátek (což mám podezření), můžete je všechny nahradit CTE (nebo většinu z nich pravděpodobně dokonce levnějšími poddotazy) a zjednodušit na jeden velký dotaz. Může být plpgsql nebo jen SQL:

CREATE FUNCTION everything(waypoints)
  RETURNS TABLE(node int, xy text[]) AS
$func$
   WITH bbox      AS (SELECT ... FROM waypoints)  -- not the fct. parameter!
    , b_spaces    AS (SELECT ... )
    , b_graph     AS (SELECT ... )
    , local_green AS (SELECT ... )
    , aug_temp    AS (SELECT ... )
    , b_graph2(source, target, cost) AS (
        SELECT ... FROM b_graph
        UNION ALL  -- guessing you really want UNION ALL
        SELECT ... FROM aug_temp
        UNION ALL 
        SELECT ... FROM aug_temp
       )
    , results     AS (SELECT id1, ... FROM b_graph2)
    , pkg         AS (SELECT loc, ... )
   SELECT id1, array_agg(loc) 
   FROM   pkg
   GROUP  BY id1
$func$ LANGUAGE sql;

Zobrazení pouze ukládají dotaz („recept“), nikoli skutečné výsledné hodnoty („polévka“).

Obvykle je levnější používat CTE místo vytváření dočasných tabulek.
Odvozené tabulky v dotazech , seřazené podle jejich typického celkového výkonu (výjimky pro speciální případy zahrnující indexy). Od pomalého k rychlému:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION pokusí se skládat duplicitní řádky. Lidé obvykle opravdu chtějí UNION ALL , který pouze připojuje řádky. Rychlejší a nesnaží se odstranit podvody.




  1. Může dosažení MAX_UTILIZATION for PROCESSES způsobit výjimku Nelze získat spravované připojení?

  2. group_concat byl přerušen při spuštění dotazu na tabulku

  3. Rozdělení řetězců v PL/SQL

  4. Implementace přírůstkového zatížení pomocí Change Data Capture v SQL Server