7

JOINを使用できる場所でSQLステートメントで「IN」キーワードを使用することによるパフォーマンスの問題はありますか?

SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
4

3 に答える 3

10

いいえ、使用しても問題ありません。

上記のクエリは、すべてのRDBMSでIN、EXISTSを使用して記述できますが、一部はINTERSECTもサポートしています。

意味的には、これは「テーブルBに少なくとも1つの一致があるテーブルAから行を取得する」セミジョインです。INNER JOINは、「一致するすべての行を指定してください」です。

したがって、TableAに3つの行があり、TableBに5つの行が一致する場合:

  • 内部結合は15行です
  • 半結合は3行です

これが、INとEXISTSが私と他のSQLタイプによってプッシュされる理由です。JOINが間違っており、DISTINCTが必要であり、速度が低下します。

EXISTSは複数列のJOINをサポートし、INはSQL Serverにはありません(他の列にはあります)。

于 2011-08-06T10:43:32.443 に答える
0

個別ではなく、groupbyを使用できます。joinを使用すると応答時間が改善される場合があります。通常、主キーと外部キーの関係を介してすべての行を結合している場合、およびwhereは非キー列を参照しています。特に複数の結合の場合。INは時々インデックススキャンを強制することができ、結合は通常、PKに行く場合はシークを使用します。設計するとき、テーブルは主キーを並べて同じ順序にし、PK/FK関係を明示的に宣言します。参加はPK/FKに限定されません。ただし、結合の一般的な使用法はPK / FKの関係をたどることであり、その場合、キーを揃えて結合を使用した経験が最高のパフォーマンスです。

于 2011-08-07T16:29:24.970 に答える
-2

ここで読むことができるように、JOINSは副選択よりも高速です。

于 2011-08-06T10:01:14.433 に答える