JOINを使用できる場所でSQLステートメントで「IN」キーワードを使用することによるパフォーマンスの問題はありますか?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
JOINを使用できる場所でSQLステートメントで「IN」キーワードを使用することによるパフォーマンスの問題はありますか?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
いいえ、使用しても問題ありません。
上記のクエリは、すべてのRDBMSでIN、EXISTSを使用して記述できますが、一部はINTERSECTもサポートしています。
意味的には、これは「テーブルBに少なくとも1つの一致があるテーブルAから行を取得する」セミジョインです。INNER JOINは、「一致するすべての行を指定してください」です。
したがって、TableAに3つの行があり、TableBに5つの行が一致する場合:
これが、INとEXISTSが私と他のSQLタイプによってプッシュされる理由です。JOINが間違っており、DISTINCTが必要であり、速度が低下します。
EXISTSは複数列のJOINをサポートし、INはSQL Serverにはありません(他の列にはあります)。
個別ではなく、groupbyを使用できます。joinを使用すると応答時間が改善される場合があります。通常、主キーと外部キーの関係を介してすべての行を結合している場合、およびwhereは非キー列を参照しています。特に複数の結合の場合。INは時々インデックススキャンを強制することができ、結合は通常、PKに行く場合はシークを使用します。設計するとき、テーブルは主キーを並べて同じ順序にし、PK/FK関係を明示的に宣言します。参加はPK/FKに限定されません。ただし、結合の一般的な使用法はPK / FKの関係をたどることであり、その場合、キーを揃えて結合を使用した経験が最高のパフォーマンスです。
ここで読むことができるように、JOINSは副選択よりも高速です。