用户定义的函数 SQL Server 2005 被错误地标记为非确定性?

Posted

技术标签:

【中文标题】用户定义的函数 SQL Server 2005 被错误地标记为非确定性?【英文标题】:User-Defined Functions SQL Server 2005 flagged incorrectly as non-deterministic? 【发布时间】: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

这是为什么?

【问题讨论】:

【参考方案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 是恒定的,但最终会出现在每一行 - 我可以将它们评估为临时的,但我希望它们最终会被重构,因为输出模式需要符合数据仓库输入的通用系统重构。

以上是关于用户定义的函数 SQL Server 2005 被错误地标记为非确定性?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在没有 [dbo] 的情况下调用 SQL Server 2005 中的函数吗?

还原SQL Server 2005数据库后,将所有用户链接到登录

sql server 2005 express 中的用户和登录名

sqlserver2005 表值函数

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

SQL Server用户自定义函数(UDF)