SELECT
T.* ,
UnitPrice * CAST(0.10 as money) [10% Commission]
FROM
(
SELECT DISTINCT SalesOrderID, UnitPrice
FROM [Sales].[SalesOrderDetail]
-- 官方範例寫法
WHERE UnitPrice > 300 / 0.1
-- 自行修正寫法
WHERE UnitPrice > 3000
) AS T
實際執行後發現是從 Constant Scan 開始跑,沒想到 300 / 0.1 有這樣效果,分析 operator 發現 GetRangeWithMismatchedTypes 存在,又多看見一個 Scalar Function Operator
加碼測試,找出 UnitPrice 最小值來當成條件,等同於會抓出全部資料,原本是期待會跑出 Index Scan,但還是從 Constant Scan 開始跑
WHERE UnitPrice >= 1.3282 -- UnitPrice 最小值
從執行計畫就可以看到抓出全部資料的 Index Seek,違和感很強大
把整個 where 條件都移除才會跑 Index Scan
- 延伸閱讀
- [SQL] Like - Constant Scan
- [SQL] Like - sp_executesql - LikeRangeStart、LikeRangeEnd、LikeRangeInfo
- 參考資料
- Scalar Functions
沒有留言:
張貼留言