SQL Server 2005标记用户定义函数为非确定性的是否有误?

4

这个问题相关,我决定检查我的数据仓库中的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个回答

5

哎呀——显然,如果不指定SCHEMABINDING,则可能会导致性能问题。

点击此处了解更多信息。

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

看起来如果修复这些问题,我可能会得到一些性能提升。不错。


在查询中使用UDF会导致巨大的性能损失,无论你做什么。如果你进入所有的查询并用函数中的SQL替换所有UDF调用的实例,你可以看到几个数量级的差异。这会导致重复的SQL,但它确实有帮助。 - Eric Z Beard
这些特定的UDF是常量,但最终会出现在每一行 - 我可以将它们评估为临时的,但我预计它们最终会被重构掉,因为输出模式需要与数据仓库输入上的通用系统重构保持一致。 - Cade Roux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接