ORACLE 表中 INDEX 启用禁用

问题描述 投票:0回答:1

我有一张表,有 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;
sql oracle plsql
1个回答
0
投票

您可能只需要启用并行 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,则启用它后加载不会受到任何影响。

© www.soinside.com 2019 - 2024. All rights reserved.