PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Impossibile eliminare la tabella temporanea nella funzione Postgres:utilizzata da query attive in questa sessione

Il messaggio di errore è piuttosto ovvio, non puoi eliminare una tabella temporanea mentre è in uso.

Potresti essere in grado di evitare il problema aggiungendo ON COMMIT DROP :

Tuttavia, questo può probabilmente essere più semplice. Se non ne hai necessità tutte quelle tabelle temporanee per cominciare (cosa che sospetto), puoi sostituirle tutte con CTE (o la maggior parte di esse probabilmente anche con sottoquery più economiche) e semplificare in una grande query. Può essere plpgsql o solo 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;

Le visualizzazioni memorizzano solo una query ("la ricetta"), non i valori risultanti effettivi ("la zuppa").

In genere è più economico utilizzare CTE invece di creare tabelle temporanee.
Tabelle derivate nelle query , ordinati in base alla loro performance complessiva tipica (eccezioni per casi speciali relativi agli indici). Da lento a veloce:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION proverebbe a piegare le righe duplicate. In genere, le persone vogliono davvero UNION ALL , che aggiunge solo righe. Più veloce e non tenta di rimuovere i duplicati.