Bri*_*sey 6 sql-server tempdb transaction-log
给定一个 SQL Server 表
和一个更新语句
可以采用哪些技术来减少执行此更新所需的峰值磁盘空间消耗(包括数据文件、日志文件和 tempdb - 如果适用)?
就本问题而言,允许以下内容:
几周前,我刚刚经历了类似的过程。经过多次尝试,使用几个更大的表(其中一个超过 1 亿行,接近 80Gb)我想出了这些步骤来加快速度并保持事务日志很小:
ALTER DATABASE [my_db] SET RECOVERY SIMPLE WITH NO_WAIT(查看此处了解更多信息)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(查看此处了解更多信息)
删除非聚集索引:此步骤将避免需要在每次操作时更新它们的麻烦(查看 Brent Ozar 博客了解更多详细信息)
使用批处理:按照mrdenny的建议,做任何你需要做的事情,更新、删除、插入,在更小的块中。
这是一次更新的批处理示例,一次 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;