为什么这个 120 GB 插入会使日志增加 780 GB 以上?

2 sql-server

一个表[tbl_old]大约有 30 亿行和大约 120 GB 的磁盘空间,然后创建了一个[tbl_new]具有相同架构的表(实际上,只是转储了 的脚本[tbl_old],然后将表名重命名为[tbl_new],然后创建它)。

但是当运行这个 SQL 脚本时:

insert [tbl_new] 
   select * from [tbl_old]
Run Code Online (Sandbox Code Playgroud)

事务日志文件用完大约 780 GB 后挂起。

我的问题是:

  • 仅仅这样的插入脚本120GB左右合理,780GB以上的事务日志还不够吗?

  • 日志文件中有什么?

背景:

  1. 数据库处于简单恢复模式,这些[tbl_old][tbl_new]
  2. Window Server 2008 64 位上的 SQL Server 2008 R2 Enterprise。
  3. 和 Intel Xeon CPU E5645 @2.4GHz(2 个处理器),24 个 CPU,64 GB 内存

Rem*_*anu 6

日志包含每个插入记录的准确描述。那至少是 120GB,但必须乘以某个因素才能获得更多信息。1.5x 是一个很好的估计 => ~180Gb。每条记录都必须保留在日志空间中用于回滚补偿。do 和 undo 之间的 1:1 比率是一个很好的估计 => ~360Gb。现在 780Gb 是这个估计值的两倍多。像数据库中的任何其他并发活动一样,可能有如此大的大小的解释。fn_dblog如果您必须知道,您可以使用它来调查日志的使用方式。

请记住,SELECT ... INTO ... FROM ...可以最低限度记录的操作,但INSERT ... SELECT ... FROM ...实际上是没有的,除非特殊的跟踪标志610时,看到在SQL Server 2008中最小日志记录更改为细节要求做到用最小的记录INSERT ... SELECT