我有一张表,有 4 个索引和 6 个约束。现在我必须从另一个表(单表)将 1300 万条数据加载到该表中。当我这样做时,需要 10 分钟才能完成(甚至更多)。所以我决定,在插入该表之前,我将禁用约束和索引。它运行良好,并且在相对较短的时间内完成。但问题是当我尝试重建索引时,它花费了相同的时间。知道如何处理这种情况吗?
ALTER TABLE table_name DISABLE CONSTRAINT cons1;
ALTER INDEX index_name UNUSABLE;
EXECUTE IMMEDIATE 'TRUNCATE TABLE table_name';
INSERT /* APPEND PARALLEL(8) */ INTO table_name SELECT /*+ parallel(8) */ * FROM source_table;
ALTER TABLE table_name ENABLE NOVALIDATE CONSTRAINT cons1;
ALTER INDEX index_name REBUILD ONLINE;
您可能只需要启用并行 dml 并修复损坏的提示 - 如果评论开始后没有
+
则不是提示(应该是 /*+
,而不是 /*
):
alter session enable parallel dml;
INSERT /*+ APPEND PARALLEL(8) */ INTO table_name . . .
PDML 将推迟索引维护。它应该为您重建索引,尽管您可能希望用并行性标记索引:
alter index index_name parallel(degree 8)
(一次,不是每次),这可能会对某些 DDL 操作产生影响。
如果您仍然想禁用并重建,那没问题,只需使用并行性重建即可:
alter index index_name rebuild parallel (degree 8)
如果您的约束是外键,您有权禁用它。但如果它只是一个检查约束或 NOT NULL,则启用它后加载不会受到任何影响。