2017-08-08 65 views
1

我用下面在聲明一個變量時使用創建的FUNCTION有什麼好處嗎?

SELECT (
    SELECT 
     CA.FISCALWEEK 
    FROM 
     EUUKSQL01.DASHBOARD.DBO.CALENDAR CA 
    WHERE 
     CONVERT(DATE,GETDATE()) = CONVERT(DATE,CA.FULLDATE) ) - 1 

回到上週的財年的週數。如果我用了很多在查詢中謹此聲明&設置爲@LW等

我也創造了它作爲功能,

使用其中一種方法有什麼好處嗎?

+2

如果使用變量,數據庫將只執行一次查詢,但如果您將該查詢作爲函數創建並從多處調用它,則數據庫將每次都執行該查詢。這意味着設置一個局部變量應該有更好的性能。 –

+0

該函數使代碼可重用。 –

+0

一個視圖是最好的選擇 - 它是可重用的,並提供良好的性能。 – Hogan

回答

1

UDF(用戶定義的函數)可能會對查詢速度產生負面影響。如果尚未將MAXD​​OP(最大並行度)設置爲1,則使用UDF查詢將防止並行性。

你可以在你的解釋計劃中看到它,並嘗試解決方案是更快的解決方案。

另一方面,在UDF中重用代碼和調試更容易。

如果你想擁有兩者,你可以編寫自己的CLR,它包含UDF的邏輯。

測試我做:

CREATE FUNCTION [dbo].[GetLW]() 
RETURNS datetime 
AS 
BEGIN 
RETURN CONVERT(DATE,GETDATE()) 
END 
GO 

SELECT * 
FROM [TGR].[dbo].[LargeTable] 
WHERE BookingDate = [dbo].[GetLW]() 
GO 

DECLARE @LW datetime = CONVERT(DATE,GETDATE()) 

SELECT * 
FROM [TGR].[dbo].[LargeTable] 
WHERE BookingDate = @LW 
GO 

解釋計劃:

enter image description here

所以,如果你是在一個數據倉庫/ BI環境,也許該變量是更好的解決方案。

問候 TGR

+0

這是非常有用的,我能夠做類似的事情,當我跑到一起時,UDF的成本僅相對於該批次僅爲12% – PeterH

0

使用GETDATE()得到的非確定性的結果。我建議在變量中使用結果。除了通過獨特的呼叫獲得表現外,您還可以避免不一致的結果。想象一下,如果在兩個稅周之間的午夜有一系列的GETDATE調用,其中一些會在之前和之後進行,那麼會發生什麼情況。

相關問題