台灣最大程式設計社群網站
線上人數
2113
 
會員總數:246479
討論主題:189988
歡迎您免費加入會員
討論區列表 >> MS SQL >> 有關子查詢影響速度的問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
有關子查詢影響速度的問題
價值 : 30 QP  點閱數:5766 回應數:9
樓主

荔枝
中級專家
2677 787
10036 2628
發送站內信

捐贈 VP 給 荔枝
我一直搞不清楚子查詢影響SQL查詢速度的觀念,
在此請教各位大大們,
如果像下面這樣的SQL:
SELECT * FROM ABC WHERE a NOT IN (SELECT a FROM DEF)......
此時,是不是DEF的資料列愈多,查詢出來的速度就愈慢呢??
還是說,因為是NOT IN ,所以DEF愈多,取出來相符的就愈少,查詢速度就愈快呢??
請教各位,謝謝!

本篇文章發表於2010-04-23 18:51
1樓
不錯的參考

Dreamyi
捐贈 VP 給 Dreamyi 檢舉此回應
在相同的環境下,應該是這個子查詢(SELECT a FROM DEF)查出來的資料量越少,查詢的速度會越快。
本篇文章回覆於2010-04-23 19:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
不錯的參考

Sdany
捐贈 VP 給 Sdany 檢舉此回應
試試加個 distinct
再看看 DEF 的 a 是否為索引

本篇文章回覆於2010-04-23 19:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

金剛
捐贈 VP 給 KKBruce 檢舉此回應
你不清礎的應該是in與not in
IN (...) in是只找出...的資料
NOT IN ( ... ) not in是「排除」...的資料

所以你帶入in的資料越多,影響越大;
反之,not in的資料越多,效能越快。
本篇文章回覆於2010-04-23 22:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
不錯的參考

Sdany
捐贈 VP 給 Sdany 檢舉此回應
>> 反之,not in的資料越多,效能越快。

今天寫個 Access 查詢指令
就是這樣寫卡住了,也不知道為什麼

※資料沒有超過 2千筆 ,not in (1千多筆)
Access 就不會動了,怪怪的...

※我不是說這個理論是錯的,只是剛好遇到怪問題。
本篇文章回覆於2010-04-24 00:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

金剛
捐贈 VP 給 KKBruce 檢舉此回應
記得,在in or not in前面是一個where
in (b, c, d)
會等於
where a=b, a=c, a=d
是一種「乘積」關係,
所以在大量資料時,我覺得…
本篇文章回覆於2010-04-24 10:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
不錯的參考

pilipala
檢舉此回應
用執行計畫就可以看出 5F 所說的邏輯 ~~
本篇文章回覆於2010-04-24 11:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

荔枝
捐贈 VP 給 荔枝 檢舉此回應
謝謝各位大大的回答,但是我有個矛盾的問題:
一樓:這個子查詢(SELECT a FROM DEF)查出來的資料量越「少」,查詢的速度會越快。
三樓:反之,not in的資料越「多」,效能越快。
這2位大大的回答好像剛好是矛盾的,請問哪一個論點才是對的呢?..........
還是說我誤解了大大們的意思?
再次請教,謝謝!
本篇文章回覆於2010-04-27 12:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

金剛
捐贈 VP 給 KKBruce 檢舉此回應
我認了,人是我殺的。

在in與not in,最終會轉換成where條件,記得。

有兩個關係:
一、Select出來的資料多少。
二、Where帶的條件。

在1000筆資料裡,你是要使用in(包含)還是not in(排除)才會快?
in (10筆) / not in (90筆)?
in (90筆) / in (10筆)?

在100萬筆資料裡,你是要使用in(包含)還是not in(排除)才會快?
in (10萬筆) / not in (90萬筆)?
in (90萬筆) / not in (10萬筆)?

其實兩題一模一樣,只是把資料量變大時,就看得出差異。
原則很簡單,選的那一個。

以第二題為例,
in (10萬筆) --> 代表10萬條where條件
not in (90萬筆) --> 代表90萬條where條件

不用我說應該就知道,「效能差異」馬上分別出來,in與not in一體兩面,能下in就能下not in,找出的那一個才是重點。
本篇文章回覆於2010-04-27 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

Dreamyi
捐贈 VP 給 Dreamyi 檢舉此回應
子查詢就是查詢【另一個查詢的結果】,以您的例子來說:
SELECT * FROM ABC WHERE a NOT IN (SELECT a FROM DEF)......
就是要盡量壓低 (SELECT a FROM DEF) 這個查詢的資料量就對了。
本篇文章回覆於2010-04-27 14:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.