PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tidak dapat menjatuhkan tabel temp di fungsi Postgres:digunakan oleh kueri aktif di sesi ini

Pesan kesalahannya cukup jelas, Anda tidak dapat menjatuhkan tabel sementara saat sedang digunakan.

Anda mungkin dapat menghindari masalah dengan menambahkan ON COMMIT DROP :

Namun, ini mungkin bisa lebih sederhana. Jika Anda tidak membutuhkan semua tabel temp untuk memulai (yang saya curigai), Anda dapat mengganti semuanya dengan CTE (atau sebagian besar dari mereka mungkin bahkan dengan subkueri yang lebih murah) dan menyederhanakannya menjadi satu kueri besar. Bisa plpgsql atau hanya 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;

Tampilan hanya menyimpan kueri ("resep"), bukan nilai yang dihasilkan sebenarnya ("sup").

Biasanya lebih murah menggunakan CTE daripada membuat tabel sementara.
Tabel turunan dalam kueri , diurutkan berdasarkan kinerja keseluruhan yang khas (pengecualian untuk kasus khusus yang melibatkan indeks). Dari lambat ke cepat:

CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery

UNION akan mencoba melipat baris duplikat. Biasanya, orang sangat menginginkan UNION ALL , yang hanya menambahkan baris. Lebih cepat dan tidak mencoba menghapus penipuan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri SELECT rekursif untuk mengembalikan tingkat kedalaman sewenang-wenang?

  2. postgresql bergabung dengan 2 tabel

  3. Postgres menyalin DB Produksi Heroku ke DB pengembangan lokal

  4. panggilan fungsi agregat postgres mungkin tidak bersarang

  5. Cara menggunakan array_agg() untuk varchar[]