我们的应用程序需要向 SQL Server 2005 数据库添加大量文本(单条记录最多 1 GB)。出于性能原因,这是通过对每个块进行存储过程调用(例如,usp_AddChunk)以块的形式完成的。usp_AddChunk 没有任何显式事务。
我看到的是,将块大小从 100MB 减少到 10MB 会导致事务日志大大增加。有人告诉我这是因为每次调用 usp_AddChunk 时,“隐式”(我的术语)事务都会记录所有现有文本。因此,对于 150MB 的记录:
100MB 块大小:100(记录 0 字节)+ 50(记录 100 MB)= 记录 100 MB
会小于
10 MB 块大小:10(记录 0 字节)+ 10(记录 10 MB)+ 10(记录 20 MB)... + 10(记录 140 MB)= 记录 1050 MB
我认为通过在我的 C# 代码中打开一个事务(在我添加第一个块之前,并在最后一个块之后提交),这个“隐式”事务不会发生,我可以避免巨大的日志文件。但我的测试显示,使用 ADO.NET 事务的事务日志增长了 5 倍。
我不会发布代码,但这里有一些细节:
- 我打电话给 SqlConnection.BeginTransaction()
- 我为每个块使用不同的 SqlCommand
- 我将(1)中的 SqlTransaction 分配给每个 SqlCommand
- 我通常在每次 SqlCommand 执行后关闭连接,但我也尝试过不关闭连接,结果相同
这个方案有什么缺陷?如果您需要更多信息,请告诉我。谢谢!
注意:不能选择使用简单或批量日志恢复模式