我有一万亿个记录文件。批处理大小为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 ????发布于 2014-07-16 05:35:10
提交标志着成功事务的结束。因此,理论上,提交应该在成功执行所有行之后进行。如果执行语句是完全独立的,那么每个语句都应该有自己的提交(理论上)。
但是,数据库系统可能存在一些限制,需要使用自己的commit将行分成几个批。由于数据库必须预留一些空间才能进行回滚,除非提交了更改,因此巨大事务大小的“成本”可能会非常高。
因此,答案是:这取决于您的需求,您的数据库和环境。
发布于 2021-10-13 11:13:55
这在很大程度上取决于你想要实现什么,通常你需要在某件事情上妥协才能取得一些成就。例如,我正在删除我的用户不再使用存储过程访问的300万条记录。
如果我一次执行delete查询,table lock就会升级,而我的其他用户开始在我们的应用程序中获取超时问题,因为表已经被SQL Server锁定(我知道这个问题并不是特定于Server的,但可以帮助调试问题),以便使删除过程具有更好的性能,如果存在这种情况,则永远不会选择大于5000的批处理。(见锁提升阈值)
用我目前的计划,我正在删除每批3000行,只有密钥锁正在发生,这是很好的,我是提交后,50万记录被处理。
因此,如果不希望同时使用用户访问表,那么如果数据库服务器有足够的日志空间和处理速度,但是1万亿条记录是一团糟,则可以删除大量的记录。最好按批处理方式删除,或者如果1万亿条记录是表中的总记录,并且要删除所有这些记录,那么我建议使用一个truncate表。
https://stackoverflow.com/questions/24772789
复制相似问题