<< 返回文章列表

impdp create index parallel-数据泵并行创建索引

2017年12月21日
章宇文
4212

测试环境为11204单实例:  


image.png


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


image.png


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

image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png

image.png


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


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


image.png


测试导入时指定parallel等于1  


image.png


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


image.png


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


image.png


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


image.png

结论


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