使用用户定义的函数和性能?

时间:2011-09-12 13:16:07

标签: sql sql-server-2005 sqlperformance

我正在使用存储过程来获取数据,我需要动态过滤。例如,如果我不想获取一些id为5,10或12的数据,我将其作为字符串发送到过程并通过用户定义的函数将其转换为表。但我必须考虑表现,所以这里有一个例子:

解决方案1:

SELECT * 
FROM Customers 
WHERE CustomerID NOT IN (SELECT Value 
                         FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',','));

解决方案2:

CREATE TABLE #tempTable (Value NVARCHAR(4000));

INSERT INTO #tempTable 
        SELECT Value FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')

SELECT * 
    FROM BusinessAds 
    WHERE AdID NOT IN (SELECT Value FROM #tempTable)

DROP TABLE #tempTable

哪种解决方案更适合性能?

1 个答案:

答案 0 :(得分:2)

使用聚簇索引和适当的数据类型创建#temp表可能会更好

CREATE TABLE #tempTable (Value int primary key);
INSERT INTO #tempTable 
SELECT DISTINCT Value 
FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')

您还可以在TVF返回的表格上放置聚集索引。

至于哪个更好SQL Server将始终假设TVF将返回1行而不是在填充#temp表后重新编译,因此您需要考虑此假设是否可能导致子优化查询计划列表很大的情况。