【问题标题】:User-Defined Functions SQL Server 2005 flagged incorrectly as non-deterministic?用户定义的函数 SQL Server 2005 被错误地标记为非确定性?
【发布时间】:2008-11-21 17:06:56
【问题描述】:

this question 相关,我决定检查我的数据仓库中的UDF(这在很大程度上应该是确定性的),我发现了几个不应该的。

例如:

CREATE FUNCTION [udf_YearFromDataDtID]
(
    @DATA_DT_ID int
)
RETURNS int
AS
BEGIN
    RETURN @DATA_DT_ID / 10000
END

显示在此查询中:

SELECT  ROUTINE_NAME
FROM    INFORMATION_SCHEMA.ROUTINES
WHERE   IS_DETERMINISTIC = 'NO'
        AND ROUTINE_TYPE = 'FUNCTION'
ORDER BY ROUTINE_NAME

这是为什么?

【问题讨论】:

    标签: sql sql-server sql-server-2005 user-defined-functions deterministic


    【解决方案1】:

    哎呀 - 显然,它需要指定 SCHEMABINDING,否则 could cause performance problems

    ALTER FUNCTION [udf_YearFromDataDtID]
    (
        @DATA_DT_ID int
    )
    RETURNS int
    WITH SCHEMABINDING
    AS
    BEGIN
        RETURN @DATA_DT_ID / 10000
    END
    

    看起来我可以通过修复这些来获得一些性能提升。不错。

    【讨论】:

    • 无论您做什么,在查询中使用 UDF 都会对性能造成巨大影响。如果您进入所有查询并用函数中的 sql 替换所有 UDF 调用实例,您会看到几个数量级的差异。它会产生重复的 SQL,但它确实有帮助。
    • 这些特定的 UDF 是恒定的,但最终会出现在每一行 - 我可以将它们评估为临时的,但我希望它们最终会被重构,因为输出模式需要符合数据仓库输入的通用系统重构。
    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多