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

Kan ikke slippe midlertidig tabel i Postgres funktion:bliver brugt af aktive forespørgsler i denne session

Fejlmeddelelsen er ret indlysende, du kan ikke slippe en midlertidig tabel, mens den bruges.

Du kan muligvis undgå problemet ved at tilføje ON COMMIT DROP :

Dette kan dog nok være enklere. Hvis du ikke bruger alle disse midlertidige tabeller til at begynde med (som jeg formoder), du kan erstatte dem alle med CTE'er (eller de fleste af dem sandsynligvis endda med billigere underforespørgsler) og forenkle til en stor forespørgsel. Kan være plpgsql eller bare 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;

Visninger gemmer kun en forespørgsel ("opskriften"), ikke de faktiske resulterende værdier ("suppen").

Det er typisk billigere at bruge CTE'er i stedet for at oprette midlertidige tabeller.
Afledte tabeller i forespørgsler , sorteret efter deres typiske overordnede ydeevne (undtagelser for særlige tilfælde, der involverer indekser). Fra langsom til hurtig:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION ville forsøge at folde duplikerede rækker. Typisk vil folk virkelig have UNION ALL , som blot tilføjer rækker. Hurtigere og forsøger ikke at fjerne duper.




  1. Fejl ved kald af MySQL-lagret procedure via PHP

  2. Hvordan ændrer du SQL-isolationsniveauet fra Python ved hjælp af MySQLdb?

  3. Skift PostgreSQL-kolonner, der bruges i visninger

  4. Undgå filsortering med INNER JOIN + BESTIL EFTER