Plsql 更新大量记录

Plsql 更新大量记录,plsql,sql-update,multiple-columns,records,large-data-volumes,Plsql,Sql Update,Multiple Columns,Records,Large Data Volumes,我有一个表有超过10 mil的记录,我必须根据我从其他几张表中获得的数据来更新这个表的多个列,这些表同样有大量的记录。所有的表都编制了索引 我试着分批进行,并在并发会话中进行更新,但这需要很长时间。对于这个问题,有其他的解决方法吗?解决方案是构建一个全新的表(使用nologging)并并行化 1) 首先创建虚拟保持表(无行): 3) 完成后,可以重命名该表,如果原始表已分区,则交换分区,并且您只更新了一个分区,就像我们所做的那样 +)显然你也需要重建索引,查看John Bittner在AskTo

我有一个表有超过10 mil的记录,我必须根据我从其他几张表中获得的数据来更新这个表的多个列,这些表同样有大量的记录。所有的表都编制了索引


我试着分批进行,并在并发会话中进行更新,但这需要很长时间。对于这个问题,有其他的解决方法吗?

解决方案是构建一个全新的表(使用nologging)并并行化

1) 首先创建虚拟保持表(无行):

3) 完成后,可以重命名该表,如果原始表已分区,则交换分区,并且您只更新了一个分区,就像我们所做的那样


+)显然你也需要重建索引,查看John Bittner在AskTom上的评论:我确实尝试了上述方法之一,由于我需要从不同的表中更新多个列,因此创建表仍然需要很长时间。我发现创建表需要很长时间,这一操作几乎是即时的,这很有趣。您是这样创建表的吗“创建表xyz_HOLD as select*from xyz where rownum?” create table xyz_HOLD as select * from xyz where rownum<1 Alter table xyz_HOLD nologging insert /*+ append parallel (xyzhold,12) */ into xyz_hold xyzhold (field1, field2, field3) select /*+ parallel (x,12) */ xyz.field1, my_new_value_for_field2, xyz.field3 from xyz x where blah blah blah