这是更有效的更新,或如果存在则更新



我想知道哪个更有效率,为什么。

if not exists (select 1 from table where ID = 101 and TT = 5)
begin
update table 
set TT = 5
where ID = 101;
end;

update table 
set TT = 5
where ID = 101 and TT <> 5;

假设ID上有一个聚集索引(没有更多的表使用默认的表创建设置)

WHERE、IF EXISTS和IN都有不同的性能优势。我建议你看看这两篇文章。

https://www.sqlshack.com/t-sql-commands-performance-comparison-not-vs-not-exists-vs-left-join-vs-except/

https://sqlchitchat.com/sqldev/tsql/semi-joins-in-sql-server/

SQL Server通常会优化非更新的UPDATE,使其实际上不发出任何更新。因此,对于一个简单的表,您不会看到太大的差异。

  • 如果您有触发器,它们将在UPDATE语句执行时被触发,与更新了多少行无关。
    • 如果UPDATE语句在行上执行,即使它们被修改为相同的值,它们也会出现在触发器中。
    • 如果用WHERE子句过滤掉了行,例如and TT <> 5,则触发器将触发0行
  • rowversionGENERATED AS列无论如何都会被更新。
  • 集群键列将导致整行的删除和插入。
  • 如果ALLOW_SNAPSHOT_ISOLATIONREAD_COMMITTED_SNAPSHOT打开,即使不使用,那么由于行版本控制的工作方式,将始终进行实际更新。
  • 如果IF EXISTS是复杂的,它仍然可能不值得做,但在简单的情况下,它通常是。

最新更新