Customer
とCustomerEvent
の2つのテーブルがあり、どちらも数百万行あります。 SQL Server 2000では、と呼ばれるUDFをデプロイしました。これはCustomerID
とEventCode
という2つのパラメータに基づいて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行を返します。例えば、今、私たちは、SQL Server 2005の同じコード、同じUDFに移動している
SELECT TOP 5000
CustomerID, dbo.fn_CustomerEvent(1345678, 'Music')
FROM [Table1]
しかし、パフォーマンスは1分20秒3秒から劇的に低下します。
パフォーマンスを最適化するためにどこから正しい方向を指摘できますか?
"インデックスでは動作しません"とはどういう意味なのでしょうか? UDFの実行計画では、索引を使用できます。 –