我们有两个表,Customer
和CustomerEvent
都包含几百万行。在SQL Server 2000上,我们部署了一个名为fn_CustomerEvent
的UDF,该UDF基于两个参数CustomerID
和EventCode
(例如,)来返回TRUE
或FALSE
。SQL Server 2000和2005中用户定义函数的性能
SELECT dbo.fn_CustomerEvent(1345678, 'Music')
的UDF代码:
CREATE FUNCTION [dbo].[fn_CustomerEvent](@CustomerID INT, @EviCode NVARCHAR(10))
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @List NVARCHAR(10)
SELECT @List = CASE
WHEN COUNT(*) > 0 THEN 'TRUE'
ELSE 'FALSE'
END
FROM CustomerEvent
WHERE
CustomerID = @CustomerID
AND EviCode = @EviCode
RETURN @List
END
SQL Server 2000上的表现是伟大的。在3秒内返回TOP 5000行。例如,
SELECT TOP 5000
CustomerID, dbo.fn_CustomerEvent(1345678, 'Music')
FROM [Table1]
但是现在,我们正在向SQL Server 2005中相同的代码,同一UDF,但性能从3秒大幅下降到1分20秒。
任何人都可以指出一个正确的方向,我应该从哪里开始优化性能?
不确定你的意思是“它们不适用于索引”,你能详细说明吗? UDF的执行计划可以使用索引。 – 2012-03-19 16:28:58