Er is geen verschil tussen deze twee statements, en de optimizer transformeert de IN
naar de =
wanneer IN
bevat maar één element.
Maar als je een vraag als deze hebt, voer dan gewoon beide verklaringen uit, voer hun uitvoeringsplan uit en bekijk de verschillen. Hier - je zult er geen vinden.
Na een uitgebreide online zoektocht vond ik een document op SQL om dit te ondersteunen (ik neem aan dat dit van toepassing is op alle DBMS):
Hier is het uitvoeringsplan van beide queries in Oracle (de meeste DBMS zullen dit op dezelfde manier verwerken):
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 |
-----------------------------------------------------
En voor 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 |
-----------------------------------------------------
Zoals je kunt zien, zijn beide identiek. Dit staat in een geïndexeerde kolom. Hetzelfde geldt voor een niet-geïndexeerde kolom (alleen volledige tabelscan).