Sql server 为什么我的特定用户定义函数非常慢?
从开始:X可以有零个或多个Y;X与特定的Z相关联 我的函数计算所有X,而不计算与特定Z关联的Y;这是我的自定义项功能:Sql server 为什么我的特定用户定义函数非常慢?,sql-server,sql-server-2008,tsql,user-defined-functions,database-performance,Sql Server,Sql Server 2008,Tsql,User Defined Functions,Database Performance,从开始:X可以有零个或多个Y;X与特定的Z相关联 我的函数计算所有X,而不计算与特定Z关联的Y;这是我的自定义项功能: ALTER FUNCTION [dbo].[CountXWithNoYByZ] ( @zUID int ) RETURNS int AS BEGIN DECLARE @result int IF (@zUID IS NULL) RETURN -1; SET @result = ( SELECT COUNT(DISTINCT X.UID)
ALTER FUNCTION [dbo].[CountXWithNoYByZ]
(
@zUID int
)
RETURNS int
AS
BEGIN
DECLARE @result int
IF (@zUID IS NULL)
RETURN -1;
SET @result =
(
SELECT COUNT(DISTINCT X.UID)
FROM X
INNER JOIN XZ ON X.UID = XZ.X_UID
LEFT JOIN Y ON X.UID = Y.X_UID
WHERE (Y.UID IS NULL) AND (XZ.Z_UID = @zUID)
)
RETURN @result
END
此功能的用法:
DECLARE @myCount int
SET @myCount = dbo.CountXWithNoYByZ(@zUID)
SELECT @myCount
当我将此函数用作标量函数时,它的速度非常慢(对于X表中的10000条记录和Y表中的20000条记录,速度分别为8秒和8秒),但在外部(<1秒)使用时,速度就不慢了。为什么?
注意:在SELECT
中使用UDF时,我意识到它的速度有些慢,因为它会为每一行运行,但我不会在SELECT
中使用它;为了便于统计,它将与存储过程中的SET
组合运行一次(与其他没有性能问题的函数一起运行)
编辑:嗯,我重新启动了SQL Server,现在速度更快了,但这并不意味着案件已经解决
我是新来的,但我想附上执行计划。。。希望有帮助!
我注意到的一些想法/事情:
SELECT X.UID
FROM X
INNER JOIN XZ ON X.UID = XZ.X_UID
WHERE (XZ.Z_UID = @zUID)
AND NOT EXISTS (SELECT 1 FROM Y WHERE X.UID = Y.X_UID)
您必须进行一些基准测试,因为根据您的数据,这当然也可能会导致性能下降 关于这一点,我要问的主要问题是,如果要将UDF包装到存储过程中,为什么还要麻烦它呢?但是假设有必要,这里有一些资源可以帮助您:您的查询计划是什么样子的?你有索引吗?我计划从多个过程中重用这个函数。是的,UID是这些表中的索引。如前所述,只有当代码用作函数时,它才会变慢。按原样使用时速度很快。很奇怪!为我们提供查询计划作为索引存在和使用的证明。@SimonSvensson:对于XZ表,我只有一个聚集索引:X_UID(ASC),Z_UID(ASC)-主键。。。这可能是个问题吗?非常感谢你的想法。。。非常感谢。。。我会根据你的意见尝试更多。你真是太棒了!这个“重新编译”的把戏帮了我!请将此链接添加到您的答案。。。这对理解我的奇怪行为很有帮助。