Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 server 在查询中使用WHERE会影响查询性能吗?_Sql Server - Fatal编程技术网

Sql server 在查询中使用WHERE会影响查询性能吗?

Sql server 在查询中使用WHERE会影响查询性能吗?,sql-server,Sql Server,我听说使用IN子句会影响性能,因为它不能正确使用索引。见下例: SELECT ID, Name, Address FROM people WHERE id IN (SELECT ParsedValue FROM UDF_ParseListToTable(@IDList)) 使用下面的表格获得这些结果是否更好 SELECT ID,Name,Address FROM People as p INNER JOIN UDF_ParseListToTable(@IDList) as ids ON p.

我听说使用IN子句会影响性能,因为它不能正确使用索引。见下例:

SELECT ID, Name, Address 
FROM people
WHERE id IN (SELECT ParsedValue FROM UDF_ParseListToTable(@IDList))
使用下面的表格获得这些结果是否更好

SELECT ID,Name,Address
FROM People as p
INNER JOIN UDF_ParseListToTable(@IDList) as ids
ON p.ID = ids.ParsedValue

这是否取决于您使用的SQL Server版本?如果是这样,哪些会受到影响?

比中的
表变量
更重要,我认为正确使用索引会提高查询的性能

另外,从表名来看,您似乎不会在其中包含很多条目,因此在这个特定示例中,您选择哪种方式可能是没有意义的

其次,
中的
将只计算一次,因为没有子查询。在您的情况下,@IDList变量可能会导致不匹配,您需要
@IDList1、@IDList2、@IdList3….
,因为
中的
需要一个列表


一般的经验法则是,您应该避免在子查询中使用
,并在联接中使用
EXISTS
,这样通常会获得更好的性能。

IN可能会影响性能,因为SQL Server必须生成完整的结果集,然后可能会创建一个巨大的IF语句,取决于结果集中的行数。顺便说一句,调用UDF也会对性能造成真正的影响。它们非常好用,但如果您不小心的话,它们确实会影响性能。你可以在谷歌上搜索UDF和性能来做一些研究。

对于大型数据集,最好使用
EXISTS
。我遵循这一点,并注意到代码执行时间的改进


根据这篇文章,它与
中的
的存在
是如何内在化的有关。另一篇文章:

您的第一个示例与第二个示例不同,因为
其中X IN(@variable)
中X=@variable
相同(即您不能有变量列表)


关于性能,您必须查看执行计划以查看选择了哪些索引。

很容易找到-打开Management studio,输入两个版本的查询,然后在打开Show execution plan的情况下运行。比较两个执行计划。查询优化器通常(但并非总是)会对逻辑上等价的查询的不同版本制定相同的精确计划/执行相同的操作

事实上,这就是它的目的——目标是优化器将接受任何版本的查询,假设逻辑相同,并制定最佳计划。唉,这个过程并不完美

这里有一个科学比较:


类似于我查看了我的原始查询,我想我明白了你在说什么。看看我的update@AbeMiessler您的版本之间仍然存在语义差异。如果列表中存在重复项,则会在第二个列表中产生交叉连接效应。因此,从理论上讲,这对执行计划的影响应该很小,但如果列表很小,则影响可能不大(第一个案例计划可能与第二个案例计划相同,添加了一个聚合以获得不同的列表)。我的钱会花在几乎类似的执行计划上。使用连接运算符存在,而IN使用或运算符。这个答案完全错误。第一个链接意味着给定查询的查询计划仅依赖于该查询-至少当涉及到
中的
存在的
查询时是如此。这是完全不真实的;像“统计”和“参数嗅探”这样的东西的存在应该足以证明这个想法与现实不符。第二篇文章很好,但它完全无关——它根本不是在讨论性能,而是在讨论
not in
与空包含集的混淆语义;这个答案所说的或链接到的任何东西都不能支持它没有正确使用索引的观点。