相關語法
inline function 有很多限制,該限制可以參考官方文件,多到嚇人的限制條件,但建立的 function 是否可以 inlineable,可以透過 sys.sql_modules 來查詢
Scalar Function
CREATE FUNCTION getTotalPrice(@PurNO char(11))
RETURNS money
BEGIN
DECLARE @TotalPrice as money
SELECT
@TotalPrice = SUM(ROUND(PurQty * Price , 0))
FROM PurchDetail
WHERE PurNO = @PurNO
RETURN @TotalPrice
END
GO
TSQL 測試語法
SELECT
PurNO ,
dbo.getTotalPrice(PurNO) AS TotalPrice
FROM Purch
WHERE PurDate BETWEEN '20180101' AND '20180630'
執行計畫觀察
在 SQL Server 2019 前版本,執行計畫會只有 Purch Table 而已
在 SQL Server 2019 上的 inline function 可以看見 PurchDetail Table 出現啦
從 Profiler 觀察 function 重覆執行情況
SQL Server 2019 前重覆執行情況
inlineable 查詢
SELECT
[object_id] ,
[definition] ,
is_inlineable
FROM sys.sql_modules
WHERE object_id = object_id('getTotalPrice')
另外文件上寫的很清楚,即使是 inlinable,也不表示就會是 inline function。SQL Server 會根據每個查詢來決定是否為 inline function,可能會因為 function 內多達數千行,而不使用 inline 功能的
沒有留言:
張貼留言