使用创建的FUNCTION而不是声明变量有什么好处吗?

时间:2017-08-08 16:23:12

标签: sql sql-server function declare

我使用以下内容返回上周财政周数

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

如果我在查询中使用了很多,我将宣读&将其设置为@LW等。

我也把它创建为FUNCTION,

使用一种方法比另一种方法有什么好处吗?

2 个答案:

答案 0 :(得分:1)

UDF(用户定义的函数)可能会对查询速度产生负面影响。如果尚未将MAXD​​OP(最大并行度)设置为1,则使用UDF进行查询将阻止并行性。

您可以在解释计划中看到它并尝试哪种解决方案更快。

另一方面,在UDF中重用代码和更容易的调试很好。

如果你想同时拥有两者,你可以编写自己的包含UDF逻辑的CLR。

我做的测试:

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

因此,如果您处于DWH / BI环境中,那么变量可能是更好的解决方案。

此致 TGR

答案 1 :(得分:0)

使用GETDATE()会产生非确定性结果。我建议在变量中使用结果。除了通过唯一调用获得性能之外,您还将受到保护,以免出现不一致的结果。想象一下,如果您在两个税周之间的午夜有一系列GETDATE调用会发生什么,其中一些在之前和之后有一些。