我們有兩個表,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