close

IN和EXISTS的差異

in和EXISTS 大多是效能上的考量
1.in的用法原理是在於,需要以逐行比較,效能性來說會比較慢
由下圖以學號比對需要3x6=18次比較,當表格越大比較越慢。

user posted image

2.EXISTS是用一整個集合來做比較,用來過濾不要的資料,在效能上來說會比較快。

 

IN和EXISTS

有時候會將一列和一系列值相比較。最簡單的辦法就是在where子句中使用子查詢。在where子句中可以使用兩種格式的子查詢。

第一種格式是使用IN操作符:

... where column in(select * from ... where ...);

第二種格式是使用EXIST操作符:

... where exists (select 'X' from ...where ...);

我相信絕大多數人會使用第一種格式,因為它比較容易編寫,而實際上第二種格式要遠比第一種格式的效率高。在Oracle中可以幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢。

第二種格式中,子查詢以‘select 'X'開始。運用EXISTS子句不管子查詢從表中抽取什麼資料它只查看where子句。這樣優化器就不必遍曆整個表而僅根據索引就可完成工作(這裏假定在where語句中使用的列存在索引)。相對於IN子句來說,EXISTS使用相連子查詢,構造起來要比IN子查詢困難一些。

通過使用EXIST,Oracle系統會首先檢查主查詢,然後運行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle系統在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用EXISTS比使用IN通常查詢速度快的原因。

同時應盡可能使用NOT EXISTS來代替NOT IN,儘管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查詢效率更高。

資料來源-請看第6點:http://blog.xuite.net/javax/programmer/3505144


當然也有不一定的情況
而假如外部的表格A是相對的儲存大量資料,則採用第一個方法IN的效率將會比較好,假如你使用EXISTS,則除了會對A這個大表格進行全面掃瞄外,還會一筆一筆讀取所有A的資料列,效能自然較差。
  
簡單的一句話,外大內小=IN,外小內大=EXISTS,這是一個實用的概略評估方法,在大部分的情況下是適用的。


PS.因為對EXISTS熟悉度還不太夠,所以找相關的文章來說明,請多指教謝謝= ="和EXISTS的差異

arrow
arrow
    全站熱搜

    幻紫芊芊 發表在 痞客邦 留言(2) 人氣()