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
SELECT
perintah dapat dengan aman ditandaiSTABLE
.Terkait:
- Cara meneruskan parameter ke fungsi tanggal
-
Anda juga menggunakan
LANGUAGE plpgsql
bukannyasql
, yang masuk akal jika Anda menjalankan fungsi beberapa kali dalam sesi yang sama. Tapi kemudian Anda juga harus membuatnyaSTABLE
atau Anda kehilangan potensi manfaat kinerja tersebut. Manual sekali lagi:STABLE
danIMMUTABLE
fungsi 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
EXPLAIN
keluaran yang tidak sesuai dengan kode yang Anda tampilkan. Apakah Anda yakin menyalinEXPLAIN
yang 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 10
seperti yang saya lakukan sekarang di atas. Dan uji lagi.