题记:在数据泵导入时默认情况下创建索引是不使用并行的,所以这一步会消耗较长的时间,除了人工写脚本并行创建索引外,数据泵在导入时也可以并行创建索引,本文详细介绍了整个测试过程并得出测试结论。

测试环境为11204单实例:

postgreql 加索引 plsql加索引_数据泵

首先创建测试表和测试索引:

postgreql 加索引 plsql加索引_postgreql 加索引_02

然后并行导出,在导入时指定parallel等于4并设置sqlfile参数,查看生成的sql文本:

postgreql 加索引 plsql加索引_并行度_03

发现sql文本中并未使用并行:

postgreql 加索引 plsql加索引_数据泵_04

接下来为了更直接的看出整个过程先开启系统级别的10046事件,再指定parallel等于4导入数据。

postgreql 加索引 plsql加索引_数据泵_05

此时,在v$pq_slave视图中已经可以查看到并行进程,且并行度为8,并且状态为BUSY,几秒钟之后变成IDLE:

postgreql 加索引 plsql加索引_oracle 加索引 %3e=_06

同时会产生8个并行进程的trace文件:

postgreql 加索引 plsql加索引_oracle 加索引 %3e=_07

查看dbwn进程的trace文件,显示创建索引时已经指定parallel为4:

postgreql 加索引 plsql加索引_数据泵_08

如下是p004进程的详细内容:

postgreql 加索引 plsql加索引_并行度_09

postgreql 加索引 plsql加索引_oracle 加索引 %3e=_10

从trace文件中可以看出在并行创建索引时,产生了2个query slave set,分别是Q10000和Q10001,这时并行度就会乘于2变为8,从执行计划id=8和id=4中分别可以看出,一组用来扫描表,一组用来创建索引。这也就是为什么我们指定parallel为4,而实际并行度为8的原因。

最后要关掉系统级别的10046事件,不然会产生非常多的trace文件:

postgreql 加索引 plsql加索引_并行度_11

测试导入时指定parallel等于1

postgreql 加索引 plsql加索引_并行度_12

可以看出数据库未生成并行的trace文件,也就是未并行创建索引:

postgreql 加索引 plsql加索引_sql_13

测试在导出时不使用并行,然后导入时指定parallel参数等于4:

postgreql 加索引 plsql加索引_oracle 加索引 %3e=_14

从trace文件可以看出,索引创建时使用了并行:

结论

Oracle ADG上的列式存储支持Oracle ADG上的列式存储支持1、数据泵在导入时一般情况下只需指定parallel>1即可在创建索引时候使用并行,导入时可以从trace文件中看到数据泵采用并行创建索引;  2、创建索引时并行度可能会等于parallel*2,这是因为oracle产生了两组query slave set,一组用来扫描表,一组用来创建索引;  3、如果数据泵带有sqlfile参数,得到的sql文本中并行度会显示为1,但是在实际导入时是可以并行创建的;  4、导出时未并行导出,导入时只要指定parallel参数同样可以并行创建索引;  5、如果不想并行创建索引,去掉parallel参数,或者指定parallel=1即可。

参考文档:Impdp Parallel Index Creation always creates indexes with degree 1. (Doc ID 1289032.1)Bug 8604502 : INDEXES ARE ALWAYS CREATED WITH PARALLEL DEGREE 1 DURING IMPORT

postgreql 加索引 plsql加索引_数据泵_15