星期五, 4月 08, 2022

[SQL] Inline Function

在 SQL Server 2019 (相容性層級 150) 推出 inline function,可以避免 [SQL] 避免在 Select 中使用 Scalar Function 該情況,把之前筆記範例放在 SQL Server 2019 上跑並觀察改善之處

相關語法

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] Inline Function-4

在 SQL Server 2019 上的 inline function 可以看見 PurchDetail Table 出現啦

[SQL] Inline Function-2 

從 Profiler 觀察 function 重覆執行情況

SQL Server 2019 前重覆執行情況

[SQL] Inline Function-5

SQL Server 2019 inline function 只會執行一次 

  [SQL] Inline Function-1

inlineable 查詢

inline function 有很多限制,該限制可以參考官方文件,多到嚇人的限制條件,但建立的 function 是否可以 inlineable,可以透過 sys.sql_modules 來查詢
SELECT
	[object_id] ,
	[definition] ,
	is_inlineable
FROM sys.sql_modules 
WHERE object_id = object_id('getTotalPrice')

[SQL] Inline Function-3

另外文件上寫的很清楚,即使是 inlinable,也不表示就會是 inline function。SQL Server 會根據每個查詢來決定是否為 inline function,可能會因為 function 內多達數千行,而不使用 inline 功能的

沒有留言:

張貼留言