Есть ли существенная разница в производительности запросов между операторами IN, NOT IN по сравнению с AND / OR? - PullRequest
1 голос
/ 08 мая 2020

Есть ли существенная разница в производительности запросов между операторами IN и NOT IN по сравнению с операторами AND / OR

1 Ответ

1 голос
/ 08 мая 2020

Я бы сказал, что в целом нет разницы между 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...