星期六, 6月 01, 2024

[SQL] 數學運算 - Constant Scan

延續 [SQL] 避免對欄位進行數學運算 筆記,官方範例原寫法如下
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

沒有留言:

張貼留言