我正在使用存储过程来获取数据,我需要动态过滤。例如,如果我不想获取一些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
哪种解决方案更适合性能?
答案 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
表后重新编译,因此您需要考虑此假设是否可能导致子优化查询计划列表很大的情况。