db2之in和exist的效能區別

2021-06-07 09:05:30 字數 1072 閱讀 4535

一、in 和exists的效能區別

in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。 

其實區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是in,那麼先執行子查詢,所以我們會以驅動表的快速返回為目標,那麼就會考慮到索引及結果集的關係了。

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

endloop

二、not in 和 not exists的效能區別:

not in 只有當子查詢中,select 關鍵字後的字段有not null約束或者有這種暗示時用not in,另外如果主查詢中表大,子查詢中的錶小但是記錄多,則應當使用not in,並使用anti hash join. 

如果主查詢表中記錄少,子查詢表中記錄多,並有索引,可以使用not exists。如果查詢語句使用了not in 那麼內外表都進行全表掃瞄,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論哪個表大,用not exists都比not in要快。

總結not exists >> not in,in與exists的使用

取決於子查詢集合大小,

in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況,即如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。

高效能之DB2效能調整和優化

db2效能調整和優化 1.效能優化應該是跨越應用系統的整個生命週期,不是使用者感覺效能差的時候開始 2.對任何程式而言,最慢最耗時間的操作是從磁碟度數 磁碟的轉數沒有較大提高 任何乙個資料庫系統 必然存在大量的 i o,所以 i o是導致資料庫效能問題的關鍵。3.db 中資料訪問都要經過緩衝池 讀的...

db2效能分析思路

2016 01 18 22 34 56 hury 摘自 db2資料庫管理最佳實踐 摘要 主要用於理清資料庫優化思路,從全域性角度進行分析 發生了什麼事情 什麼時候開始發生的 現在是否依然發生 發生前是否做過什麼更改或特別操作 以前是否發生過類似的問題 如果應用效率低些,到底有多差,一倍的差距,還是1...

DB2程式設計效能注意

2.1 大資料的導表 應該是export後再load效能更好,因為load不寫日誌。比select into 要好。2.2 sql語句盡量寫複雜sql 盡量使用大的複雜的sql語句,將多而簡單的語句組合成大的sql語句對效能會有所改善。db2的sql engieer對複雜語句的優化能力比較強,基本上...