在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语句的性能。
答案 0 :(得分:14)
不要想;轮廓。强>
在考虑速度问题时,我敦促你不要依赖直觉,你的或任何其他人的直觉。相反,尝试两种选项,进行某种分析/运行时测量,然后找出,这在您的环境中更快。
答案 1 :(得分:11)
“IN”将被翻译成一系列“OR”...如果您查看带有“IN”的查询的执行计划,您会看到它已将其展开。
在我看来,使用“IN”更加清晰,特别是在较大的查询中,它使其更具可读性。
答案 2 :(得分:4)
在测试服务器上编写两个存储过程,一个使用IN
,另一个使用OR
。运行每个程序10,000(或1,000,000,或其他)次,并比较时间。
一般来说,这是解决哪种方法更快的问题的“唯一”方法:编写简单的时序测试用例,并多次运行它们。
答案 3 :(得分:3)
在SQL Server
中,优化程序将为这些查询生成相同的计划。
答案 4 :(得分:2)
他们应该根据我的经验生成相同的计划
看看计划
答案 5 :(得分:1)
如果A
是计算,则使用IN
执行一次,使用OR
执行N次。
答案 6 :(得分:1)
无论A是计算还是列,看起来像SQL Server 2005将IN转换为OR子句。
答案 7 :(得分: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子句。
答案 8 :(得分:0)
它必须完全相等。大多数RDMBS将IN
转换为ORs
。
当然,如果您认为从INs
到ORs
的翻译耗费时间很长,则ORs
的句子会更快; - )
更新:我在考虑A
是一个专栏。