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
-
Anda membuat fungsi
VOLATILE, tetapi bisa menjadiSTABLE. Per dokumentasi:Karena perilaku snapshotting ini, fungsi yang hanya berisi
SELECTperintah dapat dengan aman ditandaiSTABLE.Terkait:
- Cara meneruskan parameter ke fungsi tanggal
-
Anda juga menggunakan
LANGUAGE plpgsqlbukannyasql, yang masuk akal jika Anda menjalankan fungsi beberapa kali dalam sesi yang sama. Tapi kemudian Anda juga harus membuatnyaSTABLEatau Anda kehilangan potensi manfaat kinerja tersebut. Manual sekali lagi:STABLEdanIMMUTABLEfungsi menggunakan snapshot yang dibuat sejak awal kueri panggilan, sedangkan fungsi VOLATILE mendapatkan snapshot baru di awal setiap kueri yang dijalankan. -
EXPLAIN. Anda keluaran menunjukkan Pemindaian Hanya Indeks , bukan pemindaian berurutan seperti yang Anda duga dalam komentar Anda. -
Ada juga langkah pengurutan di
EXPLAINkeluaran yang tidak sesuai dengan kode yang Anda tampilkan. Apakah Anda yakin menyalinEXPLAINyang benar? keluaran? Bagaimana Anda mendapatkannya? Fungsi PL/pgSQL adalah kotak hitam untukEXPLAIN. Apakah Anda menggunakanauto_explain? Detail:- Rencana kueri postgres dari permintaan UDF yang ditulis dalam pgpsql
-
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 10seperti yang saya lakukan sekarang di atas. Dan uji lagi.