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

Lewati beberapa set atau larik nilai ke suatu fungsi

Anda dapat mencapainya dengan fungsi SQL sederhana. Fitur utama adalah fungsi generate_subscripts() :

CREATE OR REPLACE FUNCTION f_attendance(_arr2d int[])
  RETURNS SETOF attendance AS
$func$
   SELECT a.*
   FROM   generate_subscripts($1, 1) i
   JOIN   attendance a ON a.class   = $1[i][1]
                      AND a.section = $1[i][2]
$func$  LANGUAGE ROWS 10 sql STABLE;

Telepon:

SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);

Atau sama dengan array literal - yang lebih nyaman dalam beberapa konteks, terutama dengan pernyataan yang disiapkan:

SELECT * FROM f_attendance('{{1,1},{2,2}}');

Fungsi selalu mengharapkan array 2D. Bahkan jika Anda melewati satu pasangan, buat sarangnya:

SELECT * FROM f_attendance('{{1,1}}');

Audit implementasi Anda

  1. Anda membuat fungsi VOLATILE , tetapi bisa menjadi STABLE . Per dokumentasi:

    Karena perilaku snapshotting ini, fungsi yang hanya berisi SELECT perintah dapat dengan aman ditandai STABLE .

    Terkait:

    • Cara meneruskan parameter ke fungsi tanggal
  2. Anda juga menggunakan LANGUAGE plpgsql bukannya sql , yang masuk akal jika Anda menjalankan fungsi beberapa kali dalam sesi yang sama. Tapi kemudian Anda juga harus membuatnya STABLE atau Anda kehilangan potensi manfaat kinerja tersebut. Manual sekali lagi:

    STABLE dan IMMUTABLE fungsi menggunakan snapshot yang dibuat sejak awal kueri panggilan, sedangkan fungsi VOLATILE mendapatkan snapshot baru di awal setiap kueri yang dijalankan.

  3. EXPLAIN . Anda keluaran menunjukkan Pemindaian Hanya Indeks , bukan pemindaian berurutan seperti yang Anda duga dalam komentar Anda.

  4. Ada juga langkah pengurutan di EXPLAIN keluaran yang tidak sesuai dengan kode yang Anda tampilkan. Apakah Anda yakin menyalin EXPLAIN yang benar? keluaran? Bagaimana Anda mendapatkannya? Fungsi PL/pgSQL adalah kotak hitam untuk EXPLAIN . Apakah Anda menggunakan auto_explain ? Detail:

    • Rencana kueri postgres dari permintaan UDF yang ditulis dalam pgpsql
  5. Perencana kueri Postgres tidak mengetahui berapa banyak elemen larik yang akan dimiliki oleh parameter yang diteruskan, sehingga sulit untuk merencanakan kueri dan mungkin default ke pemindaian berurutan (tergantung pada lebih banyak faktor). Anda dapat membantu dengan mendeklarasikan jumlah baris yang diharapkan. Jika Anda biasanya tidak memiliki lebih dari 10 item, tambahkan ROWS 10 seperti yang saya lakukan sekarang di atas. Dan uji lagi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. KASUS PostgreSQL ... BERAKHIR dengan beberapa kondisi

  2. Postgres dan Indeks pada Kunci Asing dan Kunci Utama

  3. apa urutan pelarian untuk tanda hubung (-) di PostgreSQL

  4. Cara menghapus baris duplikat tanpa pengenal unik

  5. Cara Mengatur Kata Sandi Pengguna Default di PostgreSQL