或事务日志仅包含差异。
DECLARE @f1 INT ,
@f2 INT
CREATE TABLE #t ( int F1, int f2 )
UPDATE #t
SET f1 = ISNULL(@f1, f1) ,
f2 = ISNULL(@f2, f2)
--or
IF @f1 IS NOT NULL
UPDATE #t
SET f1 = ISNULL(@f1, f1)
IF @f2 IS NOT NULL
UPDATE #t
SET f2 = ISNULL(@f2, f2)
两种方式之间的日志文件存在差异
答案 0 :(得分:3)
仅当更新是群集密钥的一部分时。
请阅读此article标题为“非更新更新的影响”,其中讨论了此问题。
摘要的
SQL Server包含许多优化功能,以避免在处理UPDATE时出现不必要的日志记录或页面刷新 不会导致持久性发生任何变化的操作 数据库中。
- 对群集表的非更新更新通常会避免额外的日志记录和页面刷新,除非形成(部分)的列 群集密钥受更新操作的影响。
- 如果群集密钥的任何部分被“更新”到相同的值,则会记录操作,就好像数据已更改,受影响的页面是 在缓冲池中标记为脏。这是一个结果 将UPDATE转换为delete-then-insert操作。
- 堆表的行为与群集表的行为相同,除了它们没有群集键以导致任何额外的日志记录或页面刷新。这个 即使在非聚集主键存在的情况下仍然如此 堆。因此,对堆的非更新更新通常会避免 额外的记录和冲洗(但见下文)。
- 对于包含超过8000个LOB列的任何行,堆和聚簇表都会遭受额外的日志记录和刷新 使用除以外的任何语法将数据字节更新为相同的值 'SET column_name = column_name'。
- 只需在数据库上启用任一类型的行版本控制隔离级别,都会导致额外的日志记录和刷新。这发生了 无论更新有效的隔离级别如何 事务。