使用多个UPDATE查询更新索引组织表(临时重复项)

时间:2014-10-01 02:56:53

标签: oracle iot

我需要在Oracle 11g上更新大型索引组织表(2000万行)的主键。

是否可以使用多个UPDATE查询执行此操作?即,一次说100,000个行的许多较小的UPDATE。问题是这些UPDATE批次中的一个可能会暂时产生一个重复的主键值(在所有UPDATE完成后都没有重复。)

所以,我想我问是否可能暂时禁用主键约束(但这是IOT所需的!)或者以某种其他方式临时更改表。我可以对此表进行独占和离线访问。

我能看到的唯一解决方案是创建一个新表,完成后,删除原始表并将新表重命名为原始表名。

我错过了另一种可能性吗?

2 个答案:

答案 0 :(得分:0)

您无法从IOT禁用/删除主键约束,因为根据定义它是唯一索引。

当我需要更改这样的IOT时,我要么为新的普通堆表执行CTAS(创建表),进行维护,然后CTAS新的IOT。

类似的东西:

create table t_temp as select * from t_iot;
-- do maintenance
create table t_new_iot as select * from t_temp;

但是,如果您需要简单地向现有密钥添加或加入新字段,则可以通过创建新的IOT结构一步完成此操作,然后使用查询直接从旧IOT填充。

不幸的是,这是物联网的缺点之一。

答案 1 :(得分:0)

我建议采用以下方法:

  1. 使用单个分区创建由系统分区的新IOT表 与当前结构完全相同。

  2. 锁定当前IOT表以防止任何DML。

  3. 插入新表中,从当前表中选择更改select中的PK值。这一步 如果需要,可以重复几次。在这种情况下,它会更好 在另一个会话中执行此操作以保持对原始表的锁定。

  4. 用原始表交换新表的分区。