【问题标题】:How can I commit a large update 1000 records at a time?如何一次提交大量更新 1000 条记录?
【发布时间】:2015-07-31 04:08:47
【问题描述】:

即使我的内部选择查询返回更多行(例如 25K),是否可以在 1000 条记录中提交更新/删除一次?

update sometable1
  set somecolumn
where somewhere in (select somewhere from sometable2);

从字面上看,我想在更新 1000 行后提交...

【问题讨论】:

  • 请使用哪个 RDBMS(SqlServer、MySql 等)?本机更新语句应该是原子的,这意味着所有记录将在完成后提交。您需要实施手动批处理 + 提交策略。
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?但是你的提交应该由你的业务逻辑决定。
  • 它的 Oracle 11G。此 SQL 不会与应用程序一起运行。需要这个来直接更新表格
  • 然后运行它,最后提交。频繁提交几乎总是比最后一次提交。顺便说一句:如果 sometable2.somewhere 可以包含 null 值,那么您的更新将无法按预期工作。
  • 没有必要这样做。这就是 Oracle 不支持它的方式。单个原子会更快。忘记其他数据库上必需的模式。另外查询应该是set somecolumn = somevalue;

标签: sql oracle11g commit


【解决方案1】:

T.Kyte 完美地解释了频繁提交的神话here

只有一件事可以表明您何时提交——您何时提交 交易完成?然后你提交,期间。

  • 导致 ORA-1555 和您的进程失败。
  • 事务完整性抛到窗外。
  • 强制您每次等待同步写入文件系统

经常错误地认为你在节约资源或让事情进展得更快,这只会为你做:

  • 让你慢下来。

  • 不节省任何资源,事实上,它消耗更多(你生成更多重做)

  • 严重质疑您数据的完整性

【讨论】:

  • 虽然我同意 >> 95% 的情况,但我在 Sql Server 中发现了一种边缘情况,即批量合并到现有的重读表(例如CQRS 读取存储),其中较小的提交大小
  • @StuartLC Oracle 从不升级锁。
猜你喜欢
  • 2020-12-11
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2018-05-28
相关资源
最近更新 更多