これは、単純なSQL関数で実現できます。主な機能は、関数 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; 電話:
SELECT * FROM f_attendance(ARRAY[[1,1],[2,2]]);
または、配列リテラルでも同じです。 -これは、一部のコンテキスト、特にプリペアドステートメントの場合に便利です:
SELECT * FROM f_attendance('{{1,1},{2,2}}');
関数常に 2D配列が必要です。 1つのペアを渡す場合でも、ネストします:
SELECT * FROM f_attendance('{{1,1}}');
実装の監査
-
関数
VOLATILEを作成しました 、ただし、STABLEにすることができます 。ドキュメントごと:このスナップショットの動作のため、
SELECTのみを含む関数 コマンドは安全にSTABLEとマークできます 。関連:
- パラメータを日付関数に渡す方法
-
LANGUAGE plpgsqlも使用しますsqlの代わりに 、これは、同じセッションで関数を複数回実行する場合に意味があります。ただし、STABLEにする必要もあります または、その潜在的なパフォーマンス上の利点を失います。もう一度マニュアル:STABLEおよびIMMUTABLE関数は、呼び出し元のクエリの開始時に確立されたスナップショットを使用しますが、VOLATILE関数は、実行する各クエリの開始時にフレッシュスナップショットを取得します。 -
あなたの
EXPLAIN出力には、インデックスのみのスキャンが表示されます 、コメントで疑うようなシーケンシャルスキャンではありません。 -
EXPLAINにも並べ替え手順があります 表示するコードと一致しない出力。正しいEXPLAINをコピーしてもよろしいですか 出力?とにかくどうやってそれを手に入れましたか? PL / pgSQL関数は、EXPLAINのブラックボックスです。 。auto_explainを使用しましたか ?詳細:- pgpsqlで記述されたUDF呼び出しのPostgresクエリプラン
-
Postgresクエリプランナーは、渡されたパラメーターが持つ配列要素の数を認識していないため、クエリを計画するのは難しく、デフォルトでシーケンシャルスキャンに設定される場合があります(より多くの要因によって異なります)。予想される行数を宣言することで支援できます。通常、アイテムが10個を超えない場合は、
ROWS 10を追加します。 私が今上でしたように。そしてもう一度テストします。