Sql 使用用户定义的功能和性能?
我正在使用存储过程获取数据,需要动态筛选。例如,如果我不想获取id为5、10或12的数据,我会将其作为字符串发送给过程,并通过用户定义的函数将其转换为表。但是我必须考虑性能,所以这里有一个例子:Sql 使用用户定义的功能和性能?,sql,sql-server-2005,sqlperformance,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',',
解决方案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
哪种解决方案对性能更有利?您最好使用聚集索引和适当的数据类型创建
#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返回的表上放置聚集索引
<> p>至于哪个SQL Server将总是假定TVF将返回1行而不是重新编译,在<代码> { Timp >表被填充之后,因此您需要考虑该假设是否可能对列表大的情况造成次优查询计划。