一个表[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以上的事务日志还不够吗?
日志文件中有什么?
背景:
[tbl_old]和[tbl_new]日志包含每个插入记录的准确描述。那至少是 120GB,但必须乘以某个因素才能获得更多信息。1.5x 是一个很好的估计 => ~180Gb。每条记录都必须保留在日志空间中用于回滚补偿。do 和 undo 之间的 1:1 比率是一个很好的估计 => ~360Gb。现在 780Gb 是这个估计值的两倍多。像数据库中的任何其他并发活动一样,可能有如此大的大小的解释。fn_dblog如果您必须知道,您可以使用它来调查日志的使用方式。
请记住,SELECT ... INTO ... FROM ...是可以最低限度记录的操作,但INSERT ... SELECT ... FROM ...实际上是没有的,除非特殊的跟踪标志610时,看到在SQL Server 2008中最小日志记录更改为细节都要求做到用最小的记录INSERT ... SELECT。
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |