これらの2つのステートメントに違いはなく、オプティマイザーはIN
を変換します =
へ IN
の場合 要素が1つだけあります。
ただし、このような質問がある場合は、両方のステートメントを実行し、実行プランを実行して、違いを確認してください。ここでは、何も見つかりません。
オンラインで大規模な検索を行った後、ドキュメント を見つけました。 これをサポートするSQLで(すべてのDBMSに適用されると思います):
Oracleでの両方のクエリの実行プランは次のとおりです(ほとんどのDBMSはこれを同じように処理します):
EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number = '123456789'
Plan hash value: 2312174735
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |
-----------------------------------------------------
そしてIN()
の場合 :
EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number in('123456789');
Plan hash value: 2312174735
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |
-----------------------------------------------------
ご覧のとおり、どちらも同じです。これはインデックス付きの列にあります。インデックス付けされていない列についても同じことが言えます(全表スキャンのみ)。