我想知道哪个更有效率,为什么。
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行
- 如果
rowversion
和GENERATED AS
列无论如何都会被更新。- 集群键列将导致整行的删除和插入。
- 如果
ALLOW_SNAPSHOT_ISOLATION
或READ_COMMITTED_SNAPSHOT
打开,即使不使用,那么由于行版本控制的工作方式,将始终进行实际更新。 - 如果
IF EXISTS
是复杂的,它仍然可能不值得做,但在简单的情况下,它通常是。