ORACLE 中IN和EXISTS比較
ORACLE 中IN和EXISTS比較
--先記下來,回頭驗證下
EXISTS的執行流程
select * from t1 where exists ( select null from t2 where y = x )
可以理解為:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
對於in 和 exists的效能區別:
如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。
其實我們區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了
另外IN時不對NULL進行處理
如:
select 1 from dual where null in (0,1,2,null)
為空
從效能上來看
exists是用loop的方式,迴圈的次數影響大,外表要記錄數少,內表就無所謂了
in用的是hash join,所以內表如果小,整個查詢的範圍都會很小,如果內表很大,外表如果也很大就很慢了,這時候exists才真正的會快過in的方式。
not in和not exists的區別
not in內外表都進行全表掃描,沒有用到索引;
not extsts 的子查詢能用到表上的索引。
所以推薦用not exists代替not in
不過如果是exists和in就要具體看情況了
create table build_tab
initrans 3
nologging
as
with generator as (
select --+ materialize
rownum id
from all_objects
where rownum <= 3000
)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28859270/viewspace-765695/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉)ORACLE 中IN和EXISTS比較Oracle
- [Oracle] minus 和 not exists比較Oracle
- oracle中關於in和exists,not in 和 not existsOracle
- oracle中的exists和not exists和in用法詳解Oracle
- oracle中的exists 和not exists 用法詳解Oracle
- [Oracle] exists 和 not existsOracle
- Oracle date 型別比較和String比較Oracle型別
- oracle中in和exists的區別Oracle
- Oracle 中 replace函式和translate函式比較Oracle函式
- (轉)ORACLE 中IN和EXISTS的區別Oracle
- ORACLE和MSSQL中行鎖比較OracleSQL
- 透過sql trace比較常規 not in 、minus、not exists效率SQL
- 通過sql trace比較常規 not in 、minus、not exists效率SQL
- sqlldr和oracle_datapump效能比較SQLOracle
- 通過shell來比較oracle和java中的字串使用OracleJava字串
- 透過shell來比較oracle和java中的字串使用OracleJava字串
- oracle中的exists理解Oracle
- js 深比較和淺比較JS
- MySQL中的NULL和空串比較MySqlNull
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- MYSQL和ORACLE時區設定比較MySqlOracle
- oracle中字串的大小比較,字串與數字的比較和運算Oracle字串
- Oracle 中不使用NOT IN 和 NOT EXISTS的另一種方法Oracle
- Java 中 Comparable 和 Comparator 比較Java
- Go中泛型和反射比較指南Go泛型反射
- 堆和棧在程式中的比較
- oracle 比較日期相等Oracle
- oracle sql日期比較:OracleSQL
- 查詢oracle比較慢的session和sqlOracleSessionSQL
- ERP軟體比較:SAP和Oracle ---itpubOracle
- Oracle dbms_stats包和analyze 的比較Oracle
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- Mysql中的Datetime和Timestamp比較MySql
- MySQL 中的 distinct 和 group by 的效能比較MySql
- VUE中diff比較Vue
- Oracle的expdp/impdp工具和exp/imp工具比較Oracle
- ORACLE11.2.0.3和MYSQL5.6 DDL比較OracleMySql
- 查詢oracle比較慢的session和SQL[轉]OracleSessionSQL