У нас есть две таблицы, Customer
и CustomerEvent
, каждая из которых содержит несколько миллионов строк. В SQL Server 2000 мы развернули пользовательскую функцию с именем fn_CustomerEvent
, которая возвращает TRUE
или FALSE
на основе двух параметров CustomerID
и EventCode
, например.
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 была отличной. Вернуть ТОП 5000 строк в течение 3 секунд. Например,
SELECT TOP 5000
CustomerID, dbo.fn_CustomerEvent(1345678, 'Music')
FROM [Table1]
Но теперь мы переходим к SQL Server 2005. Тот же код, тот же UDF, но производительность резко падает с 3 секунд до 1 минуты 20 секунд.
Может кто-нибудь указать мне правильное направление, с которого я должен начать оптимизировать производительность?