为什么我的日志文件需要 sql 服务器中物理 table 大小的 3 倍

Why my log file need 3 times the size of physical table in sql server

我有一个 table,大小约为 600 million records,table 大小约为 45 GB。我刚刚触发了一个查询以向其添加另一个 bigint 列,即应该需要大约 4GB 的存储空间,即

4GB = 600 Million * 8bytes

此 table 上没有索引。那为什么这个操作在日志文件上占用了 150GB space。

这是我正在研究的垃圾数据,以了解不同操作的影响。

我正在寻找这个问题的原因和解决方案。

添加列时,必须更改包含该列数据的每个页面 table,并且必须记录每个更改,以便在需要时可以回滚。

https://dba.stackexchange.com/questions/29522/why-does-alter-column-to-not-null-cause-massive-log-file-growth

另外 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6d7aacf6-ff41-4f59-8d4a-bd0909568626/excessive-log-growth-for-alter-column-and-insert-into 并阅读 Lekss 的回答。

您可以考虑使用 BULK LOGGED recovery mode 进行此类更改...在更改之前将其打开,然后再返回到常规日志记录。在低使用时间或(最好)计划停机时间进行更改。

此外,如果您处于完全恢复模式(与简单恢复模式相反),事务日志只会在事务日志备份后清理。完整备份将不会允许事务日志清理,在这种情况下显式收缩或截断日志不会有帮助。您希望将事务日志备份设置为您的 I/O 性能允许的频率,这可能是 a lot more frequently than you think。 SIMPLE RECOVERY 模式避免了这个问题(完全备份真的可以做所有事情),但是你失去了进行时间点恢复的能力。