Sql server 更新具有相同值的表是否会增加事务日志文件的大小?

Sql server 更新具有相同值的表是否会增加事务日志文件的大小?,sql-server,transaction-log,Sql Server,Transaction Log,或者事务日志是否只包含差异 这两个脚本之间的日志文件是否存在差异: 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

或者事务日志是否只包含差异

这两个脚本之间的日志文件是否存在差异:

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)

仅当更新是群集密钥的一部分时

阅读讨论此问题的标题为“非更新更新的影响”的文章

总结

SQL Server包含许多优化,以避免在处理更新时进行不必要的日志记录或页面刷新 操作,该操作不会导致对持久性 数据库

  • 不更新集群表的更新通常可以避免额外的日志记录和页面刷新,除非一列构成集群表的一部分 群集密钥受更新操作的影响
  • 如果群集密钥的任何部分被“更新”为相同的值,则会记录操作,就像数据已更改一样,并且会删除受影响的页面 在缓冲池中标记为脏。这是经济衰退的结果 将更新转换为先删除后插入操作
  • 堆表的行为与集群表相同,只是它们没有导致任何额外日志记录或页面刷新的集群键。这 即使服务器上存在非群集主键,情况仍然如此 堆因此,不更新堆的更新通常可以避免 额外的记录和冲洗(见下文)
  • 对于LOB列包含8000个以上的任何行,堆和集群表都将遭受额外的日志记录和刷新 数据字节使用除以下语法以外的任何语法更新为相同值 “设置列名称=列名称”。
    • 简单地在数据库上启用任一类型的行版本控制隔离级别都会导致额外的日志记录和刷新。这种情况发生了 不管更新的有效隔离级别是什么 交易

我很确定SQL Server的答案是“是”,但一些SQL Server专家应该给出明确的答案。