SQL是否重新计算每一行的函数或仅重新计算一次,将其转换为常量

Cha*_*adD 5 t-sql

如果我有一个功能

ALTER FUNCTION [dbo].[GetCycleDate]
(
)
RETURNS DATE
AS
    BEGIN
        DECLARE @CYC_DT DATE

        SELECT
            @CYC_DT = CYC_DT
        FROM
            CYC_DT
        WHERE
            CURR_CYC_IND = 'C'

        RETURN @CYC_DT

END
Run Code Online (Sandbox Code Playgroud)

对于一个非常大的表,这两个SQL会执行几乎相同的操作吗?

SELECT
    *
FROM
    [dbo].Table S
    INNER JOIN dbo.CYC_DT D ON  
        S.GL_DT = D.CYC_DT AND
        D.CURR_CYC_IND = 'C'


SELECT
    *
FROM
    [dbo].Table S
WHERE

    S.GL_DT = dbo.GetCycleDate() 
Run Code Online (Sandbox Code Playgroud)

我知道避免函数更安全,但出于测试目的,我希望能够修复函数以返回硬编码结果,而不会影响其他依赖于在Cycle周期中设置的日期的人所做的测试表.我希望能够在不影响其他任何人的情况下切换到不同的日期.

mwi*_*ahl 2

一般来说,这样做是一个坏主意,因为当涉及标量 UDF 时,优化器可以为您做的事情更加有限:

http://blogs.msdn.com/b/dfurman/archive/2009/12/02/query-performance-scalar-udfs-and-predicate-pushdown.aspx

http://www.sql-server-performance.com/2005/sql-server-udfs/

由于您的标量 UDF 未参数化,并且您的示例查询很简单,因此您可能会侥幸逃脱,但您必须进行测试才能确定。