У меня есть стол. Я должен запросить sql, например:
select * from user1 where user1.id in(1,11,111)
"1,11,111" - это уже известная ценность, когда с сессии.
Теперь я хочу заменить in
чтобы повысить производительность, но exists
не может этого сделать.
Если вы знаете, как это сделать, сообщите мне об этом. Благодарю!
Вы можете использовать OR
SELECT *
FROM user1
WHERE user1.id = 1
OR user1.id = 11
OR user1.id = 111
Я считаю, что оператор IN
просто хорош и делает именно то, для чего он предназначен. Оптимизатор будет внутренне преобразовывать запрос в условия OR
. Для простоты и меньше кода для синтаксического анализа IN сократит запрос и упростит запись вместо нескольких операторов OR.
План объяснения ясно покажет, что применяемый фильтр преобразуется в несколько OR для предложения IN.
Например,
SQL> EXPLAIN PLAN FOR SELECT * FROM emp WHERE deptno IN(10,20,30);
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 13 | 481 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 13 | 481 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
1 - filter("DEPTNO"=10 OR "DEPTNO"=20 OR "DEPTNO"=30)
13 rows selected.
Итак, как вы можете видеть, WHERE deptno IN(10,20,30)
интерпретируется оптимизатором как "DEPTNO"=10 OR "DEPTNO"=20 OR "DEPTNO"=30
in
должна быть тонкой, с точки зрения производительности.