oracle sql замените «in» для предварительного запроса

1

У меня есть стол. Я должен запросить sql, например:

select * from user1 where user1.id in(1,11,111)

"1,11,111" - это уже известная ценность, когда с сессии.

Теперь я хочу заменить in чтобы повысить производительность, но exists не может этого сделать.

Если вы знаете, как это сделать, сообщите мне об этом. Благодарю!

  • 1
    in должна быть тонкой, с точки зрения производительности.
  • 0
    Вы спрашиваете, как сгенерировать список значений программно? Что именно вы хотите изменить и почему?
Теги:

2 ответа

2

Вы можете использовать OR

SELECT *
FROM user1
WHERE user1.id = 1
OR user1.id = 11
OR user1.id = 111
  • 0
    Это беспокоить.
  • 1
    Вы можете сделать это, но почему это будет лучше? Это то, что означает IN, и оптимизатор потенциально может преобразовать одну форму запроса в другую.
Показать ещё 1 комментарий
1

Я считаю, что оператор 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню