IN和OR哪个更快?

7
在 T-SQL 中,什么更快?
DELETE * FROM ... WHERE A IN (x,y,z)

或者

DELETE * FROM ... WHERE A = x OR A = y OR A = z

在我的情况下,x、y和z是存储过程的输入参数。我正在尽我所能提高DELETE和INSERT语句的性能。

9个回答

15

不要思考,进行剖析。

我建议在考虑速度问题时,不要依赖直觉,无论是你自己的还是他人的。相反,使用某种类型的剖析/运行时间测量工具,尝试两种选项,并确定在您的情况下哪种更快。


2
+1 感谢您支持我所要表达的观点。 :-) - C. K. Young

12

"IN"将被翻译成一系列的"OR"...如果你查看一个带有"IN"的查询的执行计划,你会发现它已经展开了。

在我看来,使用"IN"更加简洁,特别是在较大的查询中,它使之更易读。


谢谢,我在执行计划中看到它将花费完全相同的CPU时间。 - Yvo
这不是真的。IN 不会被翻译成一系列 ORs。最好对查询进行分析并查看实际结果。通常情况下,EXISTS 比 IN 更快。但是 OR 应该 比两者都要快。但这取决于索引。 - Frank V
@Frank,我们正在讨论带有值列表的IN,而不是带有子查询的IN。 - Andrew Moore
@Andrew:那么,我显然对EXISTS的理解是错误的。但我仍然明白IN和OR在SQL服务器中是以不同的方式内部化的——子查询或常量值。 - Frank V
在这种情况下,它们是相同的。 - AdaTheDev

4

编写两个存储过程,一个使用IN,另一个使用OR,在测试服务器上运行每个存储过程10,000(或1,000,000,或其他)次,并比较时间。

总的来说,这几乎是回答哪种方法更快的好方法:编写简单的计时测试用例,并多次运行它们。


3
在SQL Server中,优化器将为这些查询生成相同的计划。

2

根据我的经验,它们应该生成完全相同的计划

查看计划


1
在SQL Server下绝对最快的方法是使用带有INNER JOIN的DELETE。当你有三个值时,你不会注意到差异,但是当你有更多的值时(我们正在处理数千个),差异是惊人的。你可以将你的值存储到一个临时表中,然后加入到那个表中。
例如:
DELETE C
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID

您还可以添加可选的where子句。


1
如果 A 是一个计算,它将使用 IN 一次,并使用 OR N 次。

1

无论A是计算还是列,看起来SQL Server 2005都会将IN转换为OR子句。


在你的IN子句中,如果其内容是另一个SELECT语句的结果,它还可以将其转换为一个连接操作。 - Joel Coehoorn

0

必须完全相等。大多数关系型数据库将IN翻译为ORs

当然,如果您认为从INsORs的翻译需要很多时间,那么使用ORs的句子会更快;-)

更新:我考虑A是一列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接