各位大大好,小弟近期寫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,不是應該會比較好嗎?
還是說在哪個環節沒注意到,又或者有甚麼其他更好的寫法呢?
請大大們指點迷經!!
小弟感謝感謝!!
第一種寫法如下: 在JOIN完後,使用WHERE篩選條件
這是你的理解.
你可以使用 顯示實際執行計畫
https://docs.microsoft.com/zh-tw/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-server-ver15
來觀察,是否與你理解的方式有差異? 有些版本會做些優化,可能在做 JOIN 時 也一起做 where
來篩選.
這個還是需要你多觀察,多實驗.
建立派生表,會多一些步驟,不一定會比較快,平常表的索引有設計完善,直接 join 就好
假如我是SQL
第一種作法,我會把A符合條件A.[Item] LIKE 'A%'的資料逐筆(如果A.[Item]沒有索引的話)找出,找到一筆就LEFT JOIN [TableB] AS B 然後把資料印出SELECT A.,B.
第二種作法,因為沒有SELECT * FROM [TableA] WHERE A.[Item] LIKE 'A%'這樣的資料表,所以必須先產生一的暫時的資料表,然後再用這個暫時的資料表執行第一種作法的程序