1. ホーム
  2. mysql

リテラル値が1つの場合のイコール(=)とINの性能差

2023-08-27 18:15:52

質問

等号と IN 演算子が同じ値の場合、SQL エンジンはどのように違うのでしょうか?実行時間は変更されますか?

1つ目の等号チェック演算子を使用した場合

WHERE column_value = 'All'

2つ目は IN 演算子と単一の値

WHERE column_value IN ('All')

SQLエンジンは変更されますか? IN= に変更することはできますか?

MySQLとPostgreSQLで同じような違いがありますか?

どのように解決するのですか?

この2つの記述に違いはなく、オプティマイザーは IN= としたとき IN には1つの要素しかありません。

このような疑問があるときは、両方の文を実行し、その実行計画を実行して、違いを見てみてください。ここで - あなたは何も見つけることができません。

ネットで大捜索した結果、私は ドキュメント を見つけました (すべての DBMS に適用されると仮定します)。

括弧の中に値が一つしかない場合、このコマンダー [ sic ] と等価です。

WHERE "column_name" = 'value1

以下は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  |
-----------------------------------------------------

見ての通り、どちらも同じです。これはインデックス付きカラムでの話です。インデックスがないカラムの場合も同じです(単なるフルテーブルスキャン)。