これは、単純な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
を追加します。 私が今上でしたように。そしてもう一度テストします。