SQL Server性能 - IF Select + Update vs Update

Tia*_*ira 5 sql-server performance select if-statement

我正在编写一个大脚本,其中包含每日运行的更新语句.其中一些更新会影响其他人不会的行.

我认为不会影响任何事情的更新声明不是很好的做法,但我的问题是:

  • 这有多严重影响性能?这与select语句有什么不同,只有在select选择时才更新?

谢谢Tiago

Rem*_*anu 5

首先,在并发下,SELECT跟UPDATE几乎总是不正确的。除非事情在SERIALIZABLE隔离级别下运行,否则无法保证SELECT和UPDATE 之间的行不会发生变化。

其次,当那里的情况要更新的行,SELECT + UPDATE的成本定义不仅仅是一个更新更高。

最后,对于没有行更新的情况,通过UPDATE定位它们的成本通常与SELECT定位它们的成本相同,因此您一无所获。我说的是“经常”,而不是“总是”,因为查询优化器可能会考虑不同的更新策略和选择策略,并且更新扫描发生在与读取扫描不同的锁定(并发)规则下。

可能有意义的是拥有一个非常便宜的SELECT,即使它不是100%准确的,它也可以避免昂贵的UPDATE。SELECT和UPDATE之间的条件可以有很大的不同,只要您没有任何假阴性(SELECT表示不应有任何行,但是UPDATE在运行时会找到行)和false的数量正值很低(SELECT表示有行,但是更精确/更昂贵的UPDATE检查实际上并未找到任何行)。

归根结底,这是一个优化问题,所有优化问题都始于测量。首先找到昂贵的UPDATE,然后开始修改。


Mat*_*eld 1

这取决于您如何进行更新。如果您使用连接语法进行更新(即)

UPDATE targetTable
FROM targetTable INNER JOIN sourceTable
Run Code Online (Sandbox Code Playgroud)

然后,您可以非常简单地添加 WHERE 子句,以便仅在要设置的值实际上不同时更新该行。

是的,它会影响性能,特别是如果你考虑到这样的事情......

UPDATE targetTable SET column = column
Run Code Online (Sandbox Code Playgroud)

...将触发在 UPDATE 上定义的触发器。我并不是 100% 同意这一点,但我相信这也会进入事务日志,因为需要维护它,以便日志尾部备份和镜像目标能够完全拼凑事件序列。