1. 程式人生 > >In和Exist的效率問題

In和Exist的效率問題

總有人說exist效率比in高,但真得如此嗎?

IN:
select * from t1 where x in ( select y from t2 )
事實上可以理解為:

select * from t1 where x = y1; 

select * from t1 where x = y2; 

:

select * from t1 where x = yn; 

即實際上首先找出子查詢中所有可能的值,然後多次執行外查詢。由此可見,有多少個y值,查詢就會進行多少次,因此y值越少則越快。因此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
end loop;
這個更容易理解,t1永遠是個表掃描!因此t1絕對不能是個大表,而t2可以很大,因為y=x.x可以走t2.y的索引。


綜合以上對IN/EXISTS的討論,我們可以得出一個基本通用的結論:IN適合於外表大而內表小的情況;EXISTS適合於外表小而內表大的情況。

相關推薦

oracle 索引提升查詢速度, in exist 效率

做記錄: 今天有一個有153萬條資料的表,發現查詢很慢:  select count(y) as transfereeNum,x from t_ast_subject_invest_order where x= '111' and ORDER_STATUS!=1 GROUP BY x;

in exist效率

轉載自:【http://lobert.iteye.com/blog/1676897】 mysql中的in語句是把外表和內表作hash 連線,而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。 一直大家都認為exists比in語句的效率要高,這種說法其實是不準確的。這

InExist效率問題

總有人說exist效率比in高,但真得如此嗎?IN: select * from t1 where x in ( select y from t2 ) 事實上可以理解為:select * from t1 where x = y1;  select * from t1 whe

sql中inexist語句的區別?(補充了left joinright join)

有用 表數 from 部分匹配 exist 循環 targe 從表 exists in和exists(摘錄自百度)in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用

sqlserver in exist 子查詢

1 in 子查詢 1 use StudentManageDB 2 go 3 --select StudentName from Students 4 --where StudentId=(select StudentId from ScoreList where SQLServerDB>80)

oracle inexist的區別 not in not exist的區別

in 是把外表和內表作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。一般大家都認為exists比in語句的效率要高,這種說法其實是不準確的,這個是要區分環境的。 exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 e

oracle 約1kw 資料量 in all 效率的比較

硬體條件:win8 64位;oracle 11g;記憶體:4g;處理器:酷睿i5;amemans_id 不是主鍵,但是存在索引;為保證資料更加合理性,同一次的比較,amemans_id 儘量不相同,防止查詢過程中出現快取,每一次的amemans_id 也儘量不同;以下為測試資

in exist 區別

select * from Awhere id in(select id from B) 以上查詢使用了in語句,in()只執行一次,它查出B表中的所有id欄位並快取起來.之後,檢查A表的id是否與B表中的id相等,如果相等則將A表的記錄加入結果集中,直到遍歷完A表的所有記錄

SQL語句中not in not exist的區別

in和exists in 是把外表和內表作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直以來認為exists比in效率高的說法是不準確的。 如果查詢的兩個表大小相當,那麼用in和exists差別不大。 如果兩個表中一個較小,一個是

INEXISTS、not in not exists的效率詳解

從效率來看: 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1資料量小而T2資料量非常大時,T1<<T2 時,1) 的查詢效率高。 2) select * from T1 wher

sql中inor的效率差別

總結: 在需要使用的這個欄位所在的列為索引或者主鍵時,使用in或者or的區別不是很大。 反之,在沒有索引的情況下,隨著in或者or的數量越來越多,in的效率不會有很大的下降,但是or會隨著記錄越來越多的情況下效能下降很快。 因此在給in和or的效率下定義的時候,應該再加

關於php strtr str_replace 效率的問題

abcde 優化 bcd php 7 abcdefg 5.6 nginx 網上 環境 在網上看了一些php優化的指南,裏面提到:使用strtr 函數 比 str_replace快4倍。 本著探索的精神動手驗證。 代碼 $string = ‘abcdefg‘; set_

Sql語句中INexists的區別及應用

應用場景 將不 集中 pre 代碼 根據 gif 效率 .cn   表展示     首先,查詢中涉及到的兩個表,一個user和一個order表,具體表的內容如下:     user表:          order表:        in     確定給定的值是否與子查

數據庫優化技巧之innot in

寫法 exists art null data class -s ack size 在編寫SQL語句時,假設要實現一張表有而另外一張表沒有的數據時。 通常第一直覺的寫法是: select * from table1 where table1.id not in(s

for、for inwhile以及do while

bsp 循環條件 函數 次循環 run 遍歷 tin 技術分享 html for循環:一般用在已知判斷條件的循環; for(變量初始化;循環條件判斷;循環後的執行){ 代碼塊 } //變量初始化可以省略,但是分號不能省。有多個的話用逗號隔開 //循環條件判斷是t

Sql Server參數化查詢之where inlike實現詳解

blog charindex 語句 pan 建議 ack rop for 臨時表 文章導讀 拼SQL實現where in查詢 使用CHARINDEX或like實現where in 參數化 使用exec動態執行SQl實現where in 參數化 為每一個參數生成一個參數

mysql not in not exits

blog span cnblogs uno div join col nbsp pan not exists 版本 SELECT org.*, u.rname AS uname FROM exam_org org LEFT JOIN exam_user u

SQL優化--使用 EXISTS 代替 IN inner join來選擇正確的執行計劃

tool pos inner ner 使用 邏輯讀 rda jpg 分享 在使用Exists時,如果能正確使用,有時會提高查詢速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,

關於JSON類的兩個用途與for..infor循環的區別

進行 length 區別 prop per str 字符 number stringify JSON 這個類的兩個用途: 1)將Object 對象,轉換成string 類型 var obj = {"a":"1","b":"2","c":"json"}; var

for-infor-of,forEachMap

循環對象 共同點 school 遍歷 fine 不能 name pre 包括 for-in和for-of   1.  for-in循環實際是為循環”enumerable“對象而設計的,是用來循環帶有字符串key的對象的。    使用for in會遍歷數組所有的可枚舉屬性,包