Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用用户定义的功能和性能?_Sql_Sql Server 2005_Sqlperformance - Fatal编程技术网

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

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',',

我正在使用存储过程获取数据,需要动态筛选。例如,如果我不想获取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返回的表上放置聚集索引

<> p>至于哪个SQL Server将总是假定TVF将返回1行而不是重新编译,在<代码> { Timp >表被填充之后,因此您需要考虑该假设是否可能对列表大的情况造成次优查询计划。