正在更新具有相同值的表增加事务日志文件?

时间:2014-07-28 12:03:38

标签: 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 @f2 IS NOT NULL
    UPDATE  #t
    SET     f2 = ISNULL(@f2, f2)

两种方式之间的日志文件存在差异

1 个答案:

答案 0 :(得分:3)

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

请阅读此article标题为“非更新更新的影响”,其中讨论了此问题。

  

摘要

     

SQL Server包含许多优化功能,以避免在处理UPDATE时出现不必要的日志记录或页面刷新   不会导致持久性发生任何变化的操作   数据库中。

     
      
  • 对群集表的非更新更新通常会避免额外的日志记录和页面刷新,除非形成(部分)的列   群集密钥受更新操作的影响。
  •   
  • 如果群集密钥的任何部分被“更新”到相同的值,则会记录操作,就好像数据已更改,受影响的页面是   在缓冲池中标记为脏。这是一个结果   将UPDATE转换为delete-then-insert操作。
  •   
  • 堆表的行为与群集表的行为相同,除了它们没有群集键以导致任何额外的日志记录或页面刷新。这个   即使在非聚集主键存在的情况下仍然如此   堆。因此,对堆的非更新更新通常会避免   额外的记录和冲洗(但见下文)。
  •   
  • 对于包含超过8000个LOB列的任何行,堆和聚簇表都会遭受额外的日志记录和刷新   使用除以外的任何语法将数据字节更新为相同的值   'SET column_name = column_name'。      
        
    • 只需在数据库上启用任一类型的行版本控制隔离级别,都会导致额外的日志记录和刷新。这发生了   无论更新有效的隔离级别如何   事务。
    •   
  •