私たちのグループでは、データベースの外部から取得した識別子に対してテーブルを結合する必要がある状況が頻繁に発生します。たとえば、公開データ リポジトリで見つかった一致する関連付けを持つデータをダウンロードする場合などです。
私は基本的な2つのアプローチを知っています。最も一般的に使用されるのは、IN 句のバッチ処理です。1000 個を超えるアイテムに対して結合する場合に、長い IN ステートメントを個別のクエリで透過的にラップするためのユーティリティがあります。
5 つのアイテムと 4 のバッチ制限でクエリ:
SELECT foo.id, foo.data FROM foo WHERE foo.id IN ($MANY)
になります:
SELECT foo.id, foo.data FROM foo WHERE foo.id IN (?,?,?,?)
SELECT foo.id, foo.data FROM foo WHERE foo.id IN (?)
この方法は機能しますが、非常に厄介なようです。
場合によっては、一時テーブルの作成、値の挿入、および通常のテーブルに対する結合が使用されます。このソリューションは、データがデータベースにある場合と同じように結合するだけなので、最終的なクエリに関してはもう少し標準的なようです。ただし、一時テーブルの作成は、ANSI SQL 準拠の方法で実行できるものではないようです。
性能は、予想通り外部値が少なく、IN 方式が支持されているのとほぼ同等のようです。
ANSI 標準の方法でこの問題を解決するためのベスト プラクティスは何ですか?
編集: パフォーマンス測定に関しては、アプリケーション コードのベンチマークを行っていました。これには、一時テーブルへの挿入のオーバーヘッドが含まれていました。同様に、IN 句については、バッチ処理のオーバーヘッドが含まれていました。