Mysql
 sql >> Database >  >> RDS >> Mysql

Differenze di prestazioni tra uguale (=) e IN con un valore letterale

Non c'è differenza tra queste due affermazioni e l'ottimizzatore trasformerà il IN al = quando IN contiene solo un elemento.

Tuttavia, quando hai una domanda come questa, esegui entrambe le istruzioni, esegui il loro piano di esecuzione e osserva le differenze. Qui - non ne troverai nessuno.

Dopo una lunga ricerca online, ho trovato un documento su SQL per supportare questo (presumo che si applichi a tutti i DBMS):

Ecco il piano di esecuzione di entrambe le query in Oracle (la maggior parte dei DBMS lo elaborerà allo stesso modo):

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  |
-----------------------------------------------------

E per 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  |
-----------------------------------------------------

Come puoi vedere, entrambi sono identici. Questo è su una colonna indicizzata. Lo stesso vale per una colonna non indicizzata (solo una scansione completa della tabella).