2

我有一个 1 万亿的记录文件。批处理大小为 1000,之后执行批处理。

我应该在每批之后提交吗?还是在所有 1 万亿条记录以 1000 批执行后只提交一次?

{
// Loop for 1 Trillion Records
statement.AddBatch()

      if (++count % 1000 == 0) 
       {
       statement.executeBatch()
       // SHOULD I COMMIT HERE AFTER EACH BATCH ???
       }

} // End Loop
// SHOULD I COMMIT HERE ONCE ONLY ????
4

2 回答 2

4

提交标志着成功事务的结束。所以理论上应该在所有行都成功执行之后发生。如果执行语句是完全独立的,那么每个语句都应该有自己的提交(理论上)。

但是数据库系统可能存在限制,需要使用自己的提交将行分成几批。由于除非提交更改,否则数据库必须保留一些空间才能进行回滚,因此巨大事务大小的“成本”可能非常高。

所以答案是:这取决于您的要求、您的数据库和环境。

于 2014-07-16T05:35:10.963 回答
0

大多数情况下,这取决于您想要实现的目标,通常您需要在某些事情上做出妥协才能实现某些目标。例如,我正在删除 300 万条记录,这些记录不再被我的用户使用存储过程访问。

如果我一次执行删除查询,atable lock会升级并且我的其他用户开始在我们的应用程序中遇到超时问题,因为表已被锁定SQL Server (我知道问题不是特定于 SQL Server,但可以帮助调试问题)给删除过程更好的性能,如果你有这样的情况,你永远不会去比 5000 更大的批次。(见锁升级阈值

根据我目前的计划,我每批删除 3000 行,并且只有键锁定发生,这很好,我在处理了 50 万条记录后提交。

因此,如果您不希望同时访问该表的用户,如果您的数据库服务器有足够的日志空间和处理速度,但1 万亿条记录是一团糟,您可以删除大量记录。您最好继续进行批量删除,或者如果1 万亿条记录是表中的总记录并且您想删除所有这些记录,那么我建议您选择一张truncate表。

于 2021-10-13T11:13:55.897 回答