更新所有行

kai*_*naw 12 oracle update

我想知道更新单个列的超大 Oracle 表中每一行的最有效方式。例如:

update mytable set mycolumn=null;
Run Code Online (Sandbox Code Playgroud)

或者:

update mytable set mycolumn=42;
Run Code Online (Sandbox Code Playgroud)

我的知识很可能是陈旧的。我所做的是改变表格以删除列。然后,我更改表以添加具有我要使用的新值的默认值的列。然后,我更改表以删除列的默认值。我发现这比仅运行更新要快得多,但我觉得有更好的方法。

Tal*_*ala -3

尝试多个更新/提交序列。在没有提交的情况下插入/更新/删除太多行会导致沉重的 IO 负载。知道块大小和记录大小等信息就可以对其进行相当优化。

对于删除表上的整个数据,truncate table x优于delete from x. 清除还会造成另一个流程工作负载。

编辑:您可以使用inmemory选项,以柱状格式将表加载到内存中,然后进行更新。这实际上取决于数据库的关系和结构。请参阅这篇文章

  • 您可能想阅读 Tom Kyte 关于“频繁提交”的说法:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:4951966319022 “*是错了,错了,错了。太错了……太错了*” (4认同)
  • 他们想要更新表的一列。我不知道“截断”或“删除”有什么帮助。 (3认同)
  • 您能否解释一下提交频率如何减少 I/O?他们不会因为检查点而增加 I/O 吗? (3认同)
  • 您对非常规术语(“tx 日志”、“刷新您的会话”)的使用有点令人困惑。无论您使用多个短事务还是一个大事务,生成的重做记录的总量都是相同的。I/O 操作仅在重做日志缓冲区写入磁盘时发生(暂时不考虑缓冲区高速缓存检查点),这发生在提交时或重做缓冲区几乎已满时。随后,如果您频繁提交,则会导致额外的 I/O,所以我想知道如何减少 I/O。 (3认同)