2

私たちのグループでは、データベースの外部から取得した識別子に対してテーブルを結合する必要がある状況が頻繁に発生します。たとえば、公開データ リポジトリで見つかった一致する関連付けを持つデータをダウンロードする場合などです。

私は基本的な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 句については、バッチ処理のオーバーヘッドが含まれていました。

4

1 に答える 1

0

この特定のケースでは、ID のみで照合しているため、IN 句を使用して解決することが最善の方法であり、結合よりも効率的です。結合は、一時テーブルに ID しかないこの単純なケースであっても、常に IN 句に対してかなりのオーバーヘッドが発生します。システムで両方のオプションが同じ速度で実行されるように見える場合は、数千の ID オーダーの非常に小さなテーブルがあるためですが、一時テーブルのレコード数を増やすと、常に IN 句が優先されます。

私の2セント

于 2013-11-01T18:12:52.983 に答える