使用用户定义的功能和性能



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

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

您最好使用聚集索引和适当的数据类型创建#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表后重新编译,因此您需要考虑这个假设是否会导致列表较大的情况下的次优查询计划。

相关内容

  • 没有找到相关文章

最新更新