【问题标题】:is there any benefit to using a created FUNCTION over declaring a variable?使用创建的 FUNCTION 比声明变量有什么好处吗?
【发布时间】:2017-08-08 16:23:11
【问题描述】:

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

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

如果我在查询中大量使用它,我会声明并将其设置为@LW 等。

我也将它创建为 FUNCTION,

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

【问题讨论】:

  • 如果你使用一个变量,数据库只会执行一次查询,但是如果你将该查询创建为一个函数并从许多地方调用它,数据库每次都会执行它。这意味着设置一个局部变量应该有更好的性能。
  • 该函数使代码可重用。
  • 视图是最好的选择——它是可重用的并且提供了良好的性能。

标签: sql sql-server function declare


【解决方案1】:

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

【讨论】:

  • 这非常有用,我能够做类似的事情,当我一起运行 UDF 时,相对于批处理成本仅为 12%
【解决方案2】:

使用 GETDATE() 会产生不确定的结果。我建议在变量中使用结果。除了通过独特的调用获得性能外,您还可以避免结果不一致。想象一下,如果您在两个纳税周之间的午夜有一系列 GETDATE 调用,其中一些在之前和之后,会发生什么情况。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多