用户定义的函数 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 中的用户和登录名