1

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

是否可以使用多个 UPDATE 查询来做到这一点?即许多较小的更新,一次说 100,000 行。问题是这些 UPDATE 批次之一可能会暂时产生重复的主键值(在所有 UPDATE 完成后不会有重复。)

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

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

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

4

2 回答 2

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 填充。

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

于 2014-10-01T03:04:09.407 回答
0

我会推荐以下方法:

  1. 创建新的 IOT 表,按系统分区,单分区结构与当前表完全相同。

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

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

  4. 新表与原表交换分区。

于 2014-10-01T09:31:31.270 回答