oracle sql替换“in”以提前查询

时间:2015-04-08 03:01:02

标签: java sql oracle

我有一张桌子。我必须查询一个sql,如:

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

“1,11,111”是会话中已知的值。

现在我想替换in以提升效果,但exists无法做到。

如果你知道怎么做,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用OR

SELECT *
FROM user1
WHERE user1.id = 1
OR user1.id = 11
OR user1.id = 111

答案 1 :(得分:1)

我认为IN运算符很好,完全符合它的意思。 优化程序会在内部查询转换为OR条件。为简单起见,要解析的代码较少,IN将缩短查询并易于编写而不是多个OR语句。

解释计划将清楚地显示应用的过滤器转换为IN子句的多个OR。

例如,

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