in
表示乙個確定的值在乙個集合中找出對應的值!
我理解的執行是這樣啊,先計算出子查詢的結果,然後把相關的結果臨時存放,也就產生乙個集合(但這個表在執行過程只是執行一次後生成乙個結果集)
然後主表讀取一行資料,對應列的值在集合乙個個配對,找到就顯示該行,(如果集合中有兩個相同的值會點樣做,我猜in要全部掃瞄整個集合,才返回)
然後再讀取取第二行,對應列的值在集合乙個個配對,找到就顯示該行
如此類推
再後就返回相關的資料
exist
表示在指定乙個子查詢,檢測行的存在
先讀取主表第一行資料,然後再在子查詢全表查詢(從第一行查)主表中對應列的值是否存在,一發現有就立即返回,不再向下查詢(有可能不是整個表都掃瞄過),
然後再讀取主表第一行資料,又再在子查詢表查詢(也是從第一行查)主表中對應列的值是否存在,一發現有就立即返回,不再向下查詢(有可能不是整個表都掃瞄過),
點解in適合內大外小的查詢,exits適合內小外大的查詢
我還是想不能點解??有待說明!!!
我的理觸是這樣啊,外表資料比較小,但內錶的資料比較大,例如外表a 只有兩個行資料,而內錶b 有1000,如果用in的話,io大約操作次數=2(外表兩行)*1000(內錶行數)
如果有exist的話,外表的每一行在內表中掃瞄行數<=1000,也就是每一行掃瞄的行數有可能<1000,也就行兩行掃行總次數<2000,(因為資料分布的問題),
通常exist比in 快,
「in適合內大外小的查詢,
exits適合內小外大的查詢」對這個不知點解釋,找不對例子來說明!
In與Exists的區別
這兩個函式是差不多的,但由於優化方案不同,通常not exists要比not in要快,因為not exists可以使用結合演算法而not in就不行了,而exists則不如in快,因為這時候in可能更多的使用結合演算法。select from tablea where exists select ...
Exists與In的區別
最近在check專案的資料庫,check到儲存過程,裡面看到儲存過程有用到in 和 exsits.整理下 in 和 exsits 的區別 in 是把外表和內錶做hash join,而exists是對外表做loop,每次loop再對內表進行查詢.如此,exists適合外表結果集很小的情況.其他情況則使...
In與Exists的區別
這兩個函式是差不多的,但由於優化方案不同,通常not exists要比not in要快,因為not exists可以使用結合演算法二not in就不行了,而exists則不如in快,因為這時候in可能更多的使用結合演算法。select from tablea where exists select ...