Sql 在WHERE子句中联接或嵌套SELECT以按值列表进行筛选
我有一个表类型,我们称之为ListType,它有1列字符串VARCHAR(50) 我有一个ListType类型的局部变量 它由一些字符串值填充,例如“foo”、“bah”、“something”、“else” 现在,我想将此表类型用作存储过程中的参数,以过滤将返回的表中的结果 我可以想出一些方法来做这件事- 1-加入Sql 在WHERE子句中联接或嵌套SELECT以按值列表进行筛选,sql,sql-server,azure-sql-database,Sql,Sql Server,Azure Sql Database,我有一个表类型,我们称之为ListType,它有1列字符串VARCHAR(50) 我有一个ListType类型的局部变量 它由一些字符串值填充,例如“foo”、“bah”、“something”、“else” 现在,我想将此表类型用作存储过程中的参数,以过滤将返回的表中的结果 我可以想出一些方法来做这件事- 1-加入 SELECT * FROM Table A INNER JOIN @list B ON A.Col= B.String WHERE子句中的2-IN+(选择) SELECT *
SELECT * FROM Table A
INNER JOIN @list B ON A.Col= B.String
WHERE子句中的2-IN+(选择)
SELECT *
FROM Table A
WHERE A.Col IN (SELECT [String] FROM @list)
我认为#1比#2更优化,但查询计划似乎非常相似
基础表大约有8500万行,列表中最多有5项。
有什么不同吗?正如@Gordon Linoff所提到的,看到执行计划就能正确地告诉我们发生了什么 尽管如此,我还是建议您选择选项1,因为它传递基于集合的操作。如果列表项是唯一的,我还建议您在1列中添加索引,它可以带来额外的好处 表值参数的性能与 等效参数数组的实现
将类型ListType创建为表
(
Col1字符串不为空主键
)
使用估计的时间。如果计划看起来相似,并且计划估计值相同,那么它们可能是编译到同一个执行计划。有趣的是,当我有一个列表过滤器时,这两种方法几乎是相同的。添加另一个列表并重复此过程,突然,1比2快得多。