在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语句的性能。
在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语句的性能。
“IN”将被转换为一系列的“或” S ...如果你看的执行计划的查询与“IN”,你会看到它已经扩展它。
在我看来,使用“IN”更清晰,特别是在较大的查询中,它使它更具可读性。
它必须是完全平等的。大部分RDMBS transalte IN
到ORs
。
当然,如果你考虑到翻译从INs
到ORs
要高耗时,与ORs
句子更快;-)
更新:我考虑A
是一列。
如果A
是一个计算,它将被执行一次使用IN
和N次使用OR
。
不要想;个人资料。
我劝你不要依赖直觉,你的或任何其他人的,考虑到速度的问题时。相反,尝试这两种选择,并进行某种分析/运行时间测量,并且找出,这在您的情况下更快。
写两个存储过程,一个使用IN
,另一个使用OR
,在测试服务器上。运行每个过程10,000(或1,000,000,或其他)的时间,并比较时间。
总的来说,这几乎是“唯一”的方法,以便对哪种方法更快的问题有一个很好的答案:编写简单的时序测试用例,并多次运行它们。
在SQL Server
中,优化器将为这些查询生成相同的计划。
他们应该产生从我的经验完全相同的计划
在计划看一看不管A是否是一个计算或列
,看起来像SQL Server 2005的IN转换为OR子句。
绝对最快在SQL Server是使用与INNER JOIN一个DELETE。有了三个值你就不会注意到这个差异,但是有了更多的价值(我们正在做几千个),它们之间的差别就是现象。你可以将你的值存入一张临时表,然后加入到这个表中。
E.g.
DELETE C
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID
您还可以添加一个可选的where子句。
Thnx,在执行计划中,我看到它将花费完全相同的CPU时间量。 – Zyphrax 2009-07-13 14:42:16
这是不正确的。在没有被翻译作为一个系列。您最好能够分析您的查询并实际查看结果。更多情况下EXISTS比IN更快。但OR *应该比两者快。尽管如此,它依赖于索引。 – 2009-07-13 15:10:37
@Frank,我们正在讨论带有值列表的IN,而不是带有子查询的IN。 – 2009-07-13 15:41:12