iT邦幫忙

0

SQL 執行順序

  • 分享至 

  • xImage

各位大大好,小弟近期寫SQL(mssql)遇到一個問題如下,
描述: 資料表A、B,使用[Key]做為連結

第一種寫法如下: 在JOIN完後,使用WHERE篩選條件

SELECT  A.*
    ,B.*
FROM [TableA] AS A
LEFT JOIN [TableB] AS B
    ON A.[Key] = B.[Key]
WHERE A.[Item] LIKE 'A%'

第二種寫法如下: 先進行A表篩選,在進行JOIN

SELECT A.*
    ,B.*
FROM (
    SELECT *
    FROM [TableA]
    WHERE A.[Item] LIKE 'A%'
) AS A
LEFT JOIN [TableB] AS B
    ON A.[Key] = B.[Key]

執行出來的結果(5次平均),方法1速度較方法2快,
想請問方法2因為有先經過篩選在join,不是應該會比較好嗎?
還是說在哪個環節沒注意到,又或者有甚麼其他更好的寫法呢?

請大大們指點迷經!!

小弟感謝感謝!!

阿海 iT邦新手 2 級 ‧ 2022-03-16 10:43:31 檢舉
子查詢比較慢很正常吧
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
一級屠豬士
iT邦大師 1 級 ‧ 2022-03-15 11:18:24

第一種寫法如下: 在JOIN完後,使用WHERE篩選條件
這是你的理解.

你可以使用 顯示實際執行計畫
https://docs.microsoft.com/zh-tw/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-server-ver15

來觀察,是否與你理解的方式有差異? 有些版本會做些優化,可能在做 JOIN 時 也一起做 where
來篩選.
這個還是需要你多觀察,多實驗.

了解,感謝大大。
小弟在測試看看!!

1
koro_michael
iT邦新手 2 級 ‧ 2022-03-15 11:29:39

建立派生表,會多一些步驟,不一定會比較快,平常表的索引有設計完善,直接 join 就好

了解,感謝大大。
小弟只用最淺的部份去看這件事,
沒想到背後可能還有很多動作!!

2
尼克
iT邦大師 1 級 ‧ 2022-03-15 11:42:42

感謝大大,小弟研究研究!!

0
idlewu
iT邦新手 4 級 ‧ 2022-03-18 05:45:27

假如我是SQL
第一種作法,我會把A符合條件A.[Item] LIKE 'A%'的資料逐筆(如果A.[Item]沒有索引的話)找出,找到一筆就LEFT JOIN [TableB] AS B 然後把資料印出SELECT A.,B.

第二種作法,因為沒有SELECT * FROM [TableA] WHERE A.[Item] LIKE 'A%'這樣的資料表,所以必須先產生一的暫時的資料表,然後再用這個暫時的資料表執行第一種作法的程序

我要發表回答

立即登入回答