在更新非常大的表中的所有行时,减少 SQL Server 磁盘空间使用的最有效技术是什么?

Bri*_*sey 6 sql-server tempdb transaction-log

给定一个 SQL Server 表

  • 大量行
  • 没有大值数据类型的列
  • 多个索引
  • 分配的空间多于最大可能事务日志大小的可用空间
  • 具有聚集索引的单列主键(此问题的可选考虑)
  • 平均记录大小为 1k(此问题的可选考虑)

和一个更新语句

  • 需要针对每一行运行
  • 在非索引列上设置值(此问题的可选考虑因素)

可以采用哪些技术来减少执行此更新所需的峰值磁盘空间消耗(包括数据文件、日志文件和 tempdb - 如果适用)?

就本问题而言,允许以下内容:

  • 批量应用更改
  • 在单用户模式下运行
  • 改变恢复模式

Yar*_*lav 6

几周前,我刚刚经历了类似的过程。经过多次尝试,使用几个更大的表(其中一个超过 1 亿行,接近 80Gb)我想出了这些步骤来加快速度并保持事务日志很小:

这是一次更新的批处理示例,一次 1000 行:

 UPDATE TOP(1000) your_table
 SET    col1 = new_value
 WHERE  <your_condition>
 WHILE  @@rowcount > 0
 BEGIN
     UPDATE TOP(1000) your_table
     SET    col1 = new_value
     WHERE  <your_condition>;
 END;
 GO
Run Code Online (Sandbox Code Playgroud)
  • 恢复非聚集索引

  • 设置事务隔离级别读取已提交

  • ALTER DATABASE [my_db] SET RECOVERY FULL;