iT邦幫忙

0

關於 SQL 的 join..on和in()子查詢 的效能比較

以下兩種語法搜尋出來的資料相同,但是哪一種語法效能比較高?
(1)

select TS.SN 學生學號 , TS.Name 學生姓名
from TS INNER JOIN TSC 
ON TSC.SSN = TS.SN
INNER JOIN TC
ON TSC.CSN=TC.SN
where 
TC.Name='稅收基礎'

(2)

select SN,Name 
from TS 
where SN in (
SELECT SSN SN FROM TC,TSC WHERE TC.SN=TSC.CSN and TC.Name='稅收基礎'

我想知道的是 如果作多表關聯 , 是不是優先用 Join ....On 會比用 in(select ....) 子查詢要來的好呢?
看起來用 Join...On 只要做一次 select 就可以了,似乎應當效能較好。
我不確定我的想法是否正確,感謝你的回覆與解答。

外獅佬 iT邦大師 1 級 ‧ 2014-09-07 01:45:31 檢舉
用IN不如用Exist....
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
pantc328
iT邦高手 1 級 ‧ 2014-09-07 08:39:26

不是有效能監測工具可以用

這個涉及的議題非常廣
包含資料的數量,索引的建立,Where 是不是用主鍵,Join 是不用主鍵

查詢是不是包含在SP裡(他會編譯最佳)

......

7
summertw
iT邦好手 1 級 ‧ 2014-09-08 08:51:12

在這裡只針對樓的的問題說明,就不對其他的擴充多作說明了..

1.請樓主有空先去查一下SQL-92的標準語法說明,看看Join出現前後不同處及用法。

2.Join 的 ON() 用法在於資料表的內在條件應用(資料表關聯用)。
Where 裡的 IN() 使用的是資料表的外在條件應用(外在條件的範圍)。

3.SQL-92,在Join出現前,Where同時肩負著資料表的內在及外在條件的應用,因此
常發生程式不易除錯及資料關聯過於龐大時,效能不佳等問題(索引鍵指定不明確)。

以上說明希望對你有所幫助。

外獅佬 iT邦大師 1 級 ‧ 2014-11-27 17:38:30 檢舉

summertw提到:
Jolin出現前後不同

驚...有...有很大的不同臉紅

0
sten
iT邦新手 2 級 ‧ 2014-11-27 11:26:16

以我的經驗白話點來說,join on ()效率會比較好,但有前提:

  1. TSC.SSN, TS.SN, TC.SN都是primary key或是
  2. TSC.SSN, TS.SN, TC.SN都是index一部份

否則資料量大時,效能與where...in差異不大。

而where...in的效能較慢,summertw的第3點已經解釋了...

summertw提到:
3.SQL-92,在Join出現前,Where同時肩負著資料表的內在及外在條件的應用,因此常發生程式不易除錯及資料關聯過於龐大時,效能不佳等問題(索引鍵指定不明確)。

白話一點說,就是SQL會將每一筆資料都去比in裡面的子查詢,所以如果TS有1000筆,則in的子查詢需要跑1000次...,所以除非不得已,請少用in + 子查詢。

希望對你有幫助!

我要發表回答

立即登入回答