PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Die temporäre Tabelle kann in der Postgres-Funktion nicht gelöscht werden:Wird von aktiven Abfragen in dieser Sitzung verwendet

Die Fehlermeldung ist ziemlich offensichtlich, Sie können eine temporäre Tabelle nicht löschen, während sie verwendet wird.

Möglicherweise können Sie das Problem vermeiden, indem Sie ON COMMIT DROP hinzufügen :

Dies kann jedoch wahrscheinlich einfacher sein. Wenn Sie es nicht brauchen All diese temporären Tabellen zu Beginn (was ich vermute) können Sie alle durch CTEs (oder die meisten von ihnen wahrscheinlich sogar durch billigere Unterabfragen) ersetzen und zu einer großen Abfrage vereinfachen. Kann plpgsql oder nur SQL sein:

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;

Ansichten speichern nur eine Abfrage ("das Rezept"), nicht die tatsächlich resultierenden Werte ("die Suppe").

In der Regel ist es günstiger, CTEs zu verwenden, anstatt temporäre Tabellen zu erstellen.
Abgeleitete Tabellen in Abfragen , sortiert nach ihrer typischen Gesamtperformance (Ausnahmen für Sonderfälle bei Indizes). Von langsam zu schnell:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION würde versuchen, doppelte Reihen zu falten. Normalerweise wollen die Leute wirklich UNION ALL , die nur Zeilen anhängt. Schneller und versucht nicht, Duplikate zu entfernen.