1

我正在使用存储过程来获取数据,我需要动态过滤。例如,如果我不想获取一些 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

哪种解决方案对性能更好?

4

1 回答 1

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填充表后重新编译,因此您需要考虑此假设是否会在列表很大的情况下导致次优查询计划。

于 2011-09-12T13:20:33.713 回答