使用创建的函数比声明变量有什么好处吗?
is there any benefit to using a created FUNCTION over declaring a variable?
我使用下面的 return 上周财政周数
SELECT (
SELECT
CA.FISCALWEEK
FROM
EUUKSQL01.DASHBOARD.DBO.CALENDAR CA
WHERE
CONVERT(DATE,GETDATE()) = CONVERT(DATE,CA.FULLDATE) ) - 1
如果我在查询中经常使用它,我声明并将其设置为@LW 等
我也将它创建为 FUNCTION,
使用一种方法比使用另一种方法有什么好处吗?
UDF(用户定义函数)会对您的查询速度产生负面影响。如果您没有将 MAXDOP(最大并行度)设置为 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
解释计划:
因此,如果您处于 DWH/BI 环境中,也许变量是更好的解决方案。
问候
Tgr
使用 GETDATE() 会产生不确定的结果。我建议在变量中使用结果。除了通过独特的调用获得性能之外,您还将避免不一致的结果。想象一下,如果您在两个纳税周之间的午夜进行一系列 GETDATE 调用,其中一些在之前,一些在之后。
我使用下面的 return 上周财政周数
SELECT (
SELECT
CA.FISCALWEEK
FROM
EUUKSQL01.DASHBOARD.DBO.CALENDAR CA
WHERE
CONVERT(DATE,GETDATE()) = CONVERT(DATE,CA.FULLDATE) ) - 1
如果我在查询中经常使用它,我声明并将其设置为@LW 等
我也将它创建为 FUNCTION,
使用一种方法比使用另一种方法有什么好处吗?
UDF(用户定义函数)会对您的查询速度产生负面影响。如果您没有将 MAXDOP(最大并行度)设置为 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
解释计划:
因此,如果您处于 DWH/BI 环境中,也许变量是更好的解决方案。
问候 Tgr
使用 GETDATE() 会产生不确定的结果。我建议在变量中使用结果。除了通过独特的调用获得性能之外,您还将避免不一致的结果。想象一下,如果您在两个纳税周之间的午夜进行一系列 GETDATE 调用,其中一些在之前,一些在之后。