【问题标题】:Bulk update in Oracle12cOracle 12c 中的批量更新
【发布时间】:2017-02-07 22:43:13
【问题描述】:

我有一种情况,想更新一个有 1.5 亿条记录的表中的一列(所有行)。

通过更新和删除前一个表来创建重复表是最好的方法,但是没有可用的磁盘空间来保存重复表。 那么如何在更短的时间内执行更新呢?分区在桌子上。 我正在使用 oracle 12c

【问题讨论】:

  • 向我们展示您要运行的更新。
  • 这是您要填充的新列,还是您要修改的现有列?更新后的值是从该表的列中派生的,还是需要从其他表中获取值?
  • 对于现有列,我必须屏蔽 substr(column_name,1,5)||'XXXX'@APC 等字符
  • “更少的时间”不提供任何参考也无济于事。使用你现在正在做的任何方式不是比等待答案更快吗?

标签: oracle performance


【解决方案1】:

最干净的方法不是更新表,而是使用更新行的新列创建一个新表。例如,假设我需要使用某个值的最大值更新名为 old_value 的列,而不是更新 old_table :

create new_table as select foo, bar, max(old_value) from old_table; 
drop table old_table; 
rename new_table as old_table. 

如果您需要更快的速度,您可以使用不带日志记录的并行查询来完成此创建,从而生成非常少的重做日志和撤消日志。更多细节可以在这里确定:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330

【讨论】:

  • 我知道这种技术,但没有可用空间来存储新表。@gregory
  • @siva 如果您的空间太小,那么您最终可能会用完用于撤消的空间。存储空间很便宜,所以我建议您重新评估 Gregory 的建议。
  • 如果你的表是分区的,也许你可以一次重新创建表分区。
  • 如何压缩旧表:alter table old_table move compress;
  • 嗨 gregory 感谢您的建议,普通用户可以执行压缩操作吗?我没有 DBA 访问权限
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2014-04-04
相关资源
最近更新 更多