繁体   English   中英

SQL 查询更新性能

[英]SQL query update performance

我试图理解为什么带有 case 的 sql 更新的性能低于带有 where 子句的两个单独的更新。

以下是条件:

  • 如果 column1 in (1, 2, 3) 然后设置 column3 = 'A'
  • 否则设置 column3 = 'B'

我有两个选择。

选项1:

UPDATE tableA
SET Column3 = (CASE WHEN column1 IN (1,2,3) THEN 'A' ELSE 'B' END)

选项#2:

UPDATE tableA
SET column3 = 'A'
WHERE column1 IN (1,2,3)

UPDATE tableA
SET column3 = 'B'
WHERE column1 NOT IN (1, 2, 3)

选项 #2 的性能优于第一个。

如果有任何理由,我将不胜感激。

我认为选项 1 具有更好的性能,因为一个查询没有 where 子句。

您没有向我们展示您的表和索引定义,或者您的查询计划,所以这是一个猜测。

您的第一个查询基本上意味着:更新表的每一行,将列设置为'A''B' 它没有 WHERE 子句,因此它必须扫描整个表并更改每一行。

您的第二个选择,有两个查询,有可能使用索引来查找它必须更新的行。 在这两个查询之间,您仍然更新所有行。 不过看来你的系统还是省时间的。 可能的原因:

  1. SQL 服务器使用 WHERE 子句更快地查找行。
  2. 每个查询中更新的行数较小。 这种批量更新的很多成本是提交事务。 (SQL Server 捆绑所有更改并将它们提交到表中,以便它们同时显示给表的其他用户。)您的第一个示例的事务可能非常大,涉及很多 IO。

如果你想做这种多行更新,你会明智地做这样的事情。

UPDATE tableA
SET column3 = 'A'
WHERE column1 IN (1,2,3)
AND column3 <> 'A'

这将跳过不需要更改的行的更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM