Я бы сказал, что в целом нет разницы между IN
или OR
. Однако лучше проверить это, посмотрев на планы запросов:
CREATE TABLE t AS SELECT object_type AS c FROM all_objects;
EXEC DBMS_STATS.GATHER_TABLE_STATS(null,'T');
EXPLAIN PLAN FOR
SELECT * FROM T WHERE c IN ('INDEX', 'TABLE', 'SYNONYM');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
...
1 - filter("C"='INDEX' OR "C"='SYNONYM' OR "C"='TABLE')
Итак, внутренне Oracle преобразует IN
в список OR
, по крайней мере, для этого примера.
Версия с OR
генерирует точно такой же план запроса и, следовательно, имеет точно такую же производительность, что и версия с IN
:
EXPLAIN PLAN
FOR SELECT * FROM T WHERE c='INDEX' OR c='TABLE' OR c='SYNONYM';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
1 - filter("C"='INDEX' OR "C"='SYNONYM' OR "C"='TABLE')
NOT IN
, похоже, преобразована в список AND
:
EXPLAIN PLAN FOR
SELECT * FROM T WHERE c NOT IN ('INDEX', 'TABLE', 'SYNONYM');
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
1 - filter("C"<>'INDEX' AND "C"<>'TABLE' AND "C"<>'SYNONYM')