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小时以内。

posted @ 2021-03-22 14:50  曹翼宾的自留地  阅读(1582)  评论(0编辑  收藏  举报