2009-07-13 76 views
6

在T-SQL中速度更快吗?IN or OR的快点有多快?

DELETE * FROM ... WHERE A IN (x,y,z) 

或者

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

在我的情况x,y和z是用于存储过程的输入参数。我试图尽我所能地获得我的DELETE和INSERT语句的性能。

回答

11

“IN”将被转换为一系列的“或” S ...如果你看的执行计划的查询与“IN”,你会看到它已经扩展它。

在我看来,使用“IN”更清晰,特别是在较大的查询中,它使它更具可读性。

+0

Thnx,在执行计划中,我看到它将花费完全相同的CPU时间量。 – Zyphrax 2009-07-13 14:42:16

+0

这是不正确的。在没有被翻译作为一个系列。您最好能够分析您的查询并实际查看结果。更多情况下EXISTS比IN更快。但OR *应该比两者快。尽管如此,它依赖于索引。 – 2009-07-13 15:10:37

+0

@Frank,我们正在讨论带有值列表的IN,而不是带有子查询的IN。 – 2009-07-13 15:41:12

0

它必须是完全平等的。大部分RDMBS transalte INORs

当然,如果你考虑到翻译从INsORs要高耗时,与ORs句子更快;-)

更新:我考虑A是一列。

1

如果A是一个计算,它将被执行一次使用IN和N次使用OR

14

不要想;个人资料。

我劝你不要依赖直觉,你的或任何其他人的,考虑到速度的问题时。相反,尝试这两种选择,并进行某种分析/运行时间测量,并且找出,这在您的情况下更快。

4

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

总的来说,这几乎是“唯一”的方法,以便对哪种方法更快的问题有一个很好的答案:编写简单的时序测试用例,并多次运行它们。

3

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

2

他们应该产生从我的经验完全相同的计划

在计划看一看不管A是否是一个计算或列

1

,看起来像SQL Server 2005的IN转换为OR子句。

1

绝对最快在SQL Server是使用与INNER JOIN一个DELETE。有了三个值你就不会注意到这个差异,但是有了更多的价值(我们正在做几千个),它们之间的差别就是现象。你可以将你的值存入一张临时表,然后加入到这个表中。

E.g.

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

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