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 语句的性能。

4

9 回答 9

14

不要想;轮廓。

我敦促你在考虑速度问题时不要依赖直觉,无论是你的还是其他人的。相反,尝试这两个选项,使用某种分析/运行时间测量,并找出在您的情况下哪个更快。

于 2009-07-13T14:37:04.577 回答
12

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

在我看来,使用“IN”要干净得多,尤其是在较大的查询中,它使其更具可读性。

于 2009-07-13T14:36:55.717 回答
4

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

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

于 2009-07-13T14:37:29.320 回答
3

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

于 2009-07-13T14:38:05.043 回答
2

他们应该根据我的经验生成相同的确切计划

看看计划

于 2009-07-13T14:38:51.657 回答
1

如果A是一个计算,它将执行一次 usingIN和 N 次 using OR

于 2009-07-13T14:36:55.123 回答
1

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

于 2009-07-13T14:42:08.593 回答
1

SQL Server 下绝对最快的方法是使用带有 INNER JOIN 的 DELETE。使用三个值,您不会注意到差异,但是使用更多值(我们正在做几千个),差异是惊人的。您可以将您的值存储到临时表中,然后加入该表。

例如

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

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

于 2009-07-13T15:17:53.963 回答
0

它必须完全相等。大多数 RDMBS 转换INORs.

当然,如果您认为 from INsto的翻译ORs非常耗时,那么 with 的句子ORs会更快;-)

更新:我正在考虑这A是一个专栏。

于 2009-07-13T14:34:58.263 回答