Tsql 什么';在或中更快?

Tsql 什么';在或中更快?,tsql,optimization,profiling,performance,sql-optimization,Tsql,Optimization,Profiling,Performance,Sql Optimization,在T-SQL中,什么更快 DELETE * FROM ... WHERE A IN (x,y,z) 或 在我的例子中,x、y和z是存储过程的输入参数。我正在尽我最大的努力来实现DELETE和INSERT语句的性能。它必须完全相等。大多数RDMBS在到ORs之间进行传输 当然,如果你认为从 INS>代码>到 ORS/COD>的翻译要耗费大量时间,“ ORS/CODE >的句子要快一些;-)p> 更新:我认为A是一列。如果A是一个计算,它将在中使用执行一次,使用或执行N次,或中的“IN”将被转换为

在T-SQL中,什么更快

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


在我的例子中,x、y和z是存储过程的输入参数。我正在尽我最大的努力来实现DELETE和INSERT语句的性能。

它必须完全相等。大多数RDMBS在到ORs之间进行传输

当然,如果你认为从<代码> INS>代码>到 ORS/COD>的翻译要耗费大量时间,“<代码> ORS/CODE >的句子要快一些;-)p>
更新:我认为
A
是一列。

如果
A
是一个计算,它将在
中使用
执行一次,使用
执行N次,
或中的“IN”将被转换为一系列的“s”,你会看到它已经扩展了


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

别想;个人资料。


我敦促你在考虑速度问题时不要依赖直觉,不管是你的还是别人的。相反,可以尝试这两种方法,使用某种分析/运行时度量,找出哪种方法在您的环境中更快。

在测试服务器上编写两个存储过程,一个使用
中的
,另一个使用
。将每个过程运行10000次(或1000000次,或任何次数),并比较计时


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

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

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


查看计划

无论a是计算还是列,它看起来都像SQL Server 2005转换为to或子句。

SQL Server下绝对最快的方法是使用带内部联接的删除。对于三个值,你不会注意到差异,但是对于更多的值(我们正在做几千个),差异是表型的。您可以将您的值隐藏到一个临时表中,然后加入到该临时表中

例如


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

+1感谢您支持我自己想说的话。:-)Thnx,在执行计划中,我看到它将花费完全相同的CPU时间。这不是真的。In不翻译为ors系列。您最好分析您的查询并实际查看结果。存在往往比不存在快。但还是应该比两者都快。但这取决于索引。@Frank,我们讨论的是带值列表的INs,而不是带子查询的INs。@Andrew:那么我显然错了。但我仍然理解,IN和OR被SQL server内部化的方式不同——子查询或常量值。在这种情况下,它们是相同的。如果IN的内容是另一个SELECT语句的结果,它还可能将其转换为联接。
DELETE * FROM ... WHERE A = x OR A = y OR A = z
DELETE C
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID