2015-04-08 51 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