2015-04-08 42 views
1

我有一张表。我必须查询一个SQL如:oracle sql替换“in”以提前查询

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

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

现在我想替换in来提高性能,但exists不能这样做。

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

+1

的'in'要细,从性能的角度。 –

+0

你问的是如何以编程方式生成值的列表?你想要改变什么,为什么? –

回答

2

您可以使用OR

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

这是麻烦。 – eblly

+1

你可以做到这一点,但为什么它会更好?这就是IN的含义,优化器可以将查询的一种形式转换为另一种形式。 –

+0

在性能以及执行方式方面,这完全是相同的查询。 –

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