Impdp过程中索引的进一步处理
在上一篇《impdp数据导入过程中exclude参数是否排除index的验证 》中描述的在Impdp导入数据的过程中分为两个阶段:
1.纯数据导入,即content=data_only;
2.追加索引,即include=index,constraint;
导入过程中,发现:
ORA-39083: Object type INDEX:"WXJZCSK"."IDX_ACD8_PRSENO" failed to create with error:
ORA-01157: cannot identify/lock data file 5050 - see DBWR trace file
ORA-01110: data file 5050: '+DATADG/CXJBDB/B24267126E548D42E0531A14580AE2EF/TEMPFILE/temp.1674.1067731087'
Failing sql is:
CREATE UNIQUE INDEX "WXJZCSK"."IDX_ACD8_PRSENO" ON "WXJZCSK"."ACD8" ("PRSENO") REVERSE PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "AHXNB" PARALLEL 1
可见,使用impdp追加索引的过程中,哪怕是在impdp语句中配置了parameter参数大于1,建索引的过程parallel依然为1(这或许也是bug)。
进一步的优化思路:
1)小表直接导入,大表导入数据前先禁用索引和约束;
比如:
alter index SYS_C00XXXXX unusable;
alter table TESTXX disable constraint SYS_C00XXXX;
注意:如果表很大的话,主键还有其他非空约束,建议不要disable。如果disable了,一方面减少了导入时的数据唯一性和非空校验,另一方面enable约束的时间也是非常长的。
2)然后使用数据泵导入数据;
导入过程中有一个报错,提示跳过前面被设置成unsable的索引:
ORA-39817: index CLCTCXXX.STAF_XXX_NO was ignored due to:
SKIP_UNUSABLE_INDEXES requested and index segment was initially unusable
3)最后并行重建索引,激活约束;
alter index idx_XXXXX rebuild online compute statistics parallel 16;
alter index idx_XXXXX noparallel;
alter table TESTXX enable constraint SYS_C00XXXXX;
小结:
在数据导入过程中,挑出比较大的表进行处理。并行创建索引速度明显快很多,总体的数据导入快了很多。经过这样处理,导入总时间缩短到10小时以内。