Nie ma różnicy między tymi dwoma instrukcjami, a optymalizator przekształci IN
do =
kiedy IN
zawiera tylko jeden element.
Chociaż, gdy masz takie pytanie, po prostu uruchom oba oświadczenia, uruchom ich plan wykonania i zobacz różnice. Tutaj - nie znajdziesz żadnego.
Po długich poszukiwaniach w Internecie znalazłem dokument na SQL, aby to obsługiwać (zakładam, że dotyczy to wszystkich DBMS):
Oto plan wykonania obu zapytań w Oracle (większość DBMS przetworzy to samo):
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 |
-----------------------------------------------------
I dla 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 |
-----------------------------------------------------
Jak widać, oba są identyczne. To jest w indeksowanej kolumnie. To samo dotyczy nieindeksowanej kolumny (tylko pełne skanowanie tabeli).