在 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 语句的性能。
在 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 语句的性能。
不要想;轮廓。
我敦促你在考虑速度问题时不要依赖直觉,无论是你的还是其他人的。相反,尝试这两个选项,使用某种分析/运行时间测量,并找出在您的情况下哪个更快。
“IN”将被翻译成一系列“OR”......如果您查看带有“IN”的查询的执行计划,您会发现它已经扩展了它。
在我看来,使用“IN”要干净得多,尤其是在较大的查询中,它使其更具可读性。
在测试服务器上编写两个存储过程,一个 using IN
,另一个 using 。OR
将每个过程运行 10,000 次(或 1,000,000 次,或其他),然后比较时间。
一般来说,这几乎是对哪种方法更快的问题有一个很好的答案的“唯一”方法:编写简单的时序测试用例,并多次运行它们。
在SQL Server
中,优化器将为这些查询生成相同的计划。
他们应该根据我的经验生成相同的确切计划
看看计划
如果A
是一个计算,它将执行一次 usingIN
和 N 次 using OR
。
无论 A 是计算还是列,看起来 SQL Server 2005 都将 IN 转换为 OR 子句。
SQL Server 下绝对最快的方法是使用带有 INNER JOIN 的 DELETE。使用三个值,您不会注意到差异,但是使用更多值(我们正在做几千个),差异是惊人的。您可以将您的值存储到临时表中,然后加入该表。
例如
DELETE C
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID
您还可以添加可选的 where 子句。
它必须完全相等。大多数 RDMBS 转换IN
为ORs
.
当然,如果您认为 from INs
to的翻译ORs
非常耗时,那么 with 的句子ORs
会更快;-)
更新:我正在考虑这A
是一个专栏。