这也就是为什么我们指定parallel为4,而实际并行度为8的原因。
insert create index,发现并行数都是加倍的
Indexes seem always created with parallel degree 1 during import as seen from a sqlfile.
The sql file shows content like:
CREATE INDEX "<SCHEMA_NAME>"."<INDEX_NAME>" ON
"<SCHEMA_NAME>"."<TABLE_NAME>" ("<COLUMN_NAME>")
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 262144 NEXT 262144 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE
DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "<TABLESPCE_NAME>"
PARALLEL 1 ;
ALTER INDEX "<SCHEMA_NAME>"."<INDEX_NAME>" PARALLEL 24;
The database is version 11.2.0.2 or above where Bug 8604502 has been fixed.
SOLUTION
The issue is discussed in
Bug 10408313 - INDEXES ARE CREATED WITH PARALLEL DEGREE 1 DURING IMPORT
closed with status 'Not a Bug'.
The import job with SQLFILE parameter option cannot use multiple execution streams.
It always executed with parallel 1. Hence its showing the PARALLEL 1 in generated sqlfile and this is an expected behavior.
When you run the import with parallel value and without sqlfile option, then you can see the actual index creation statement with correct parallel value in DW(worker) traces.
题记:在数据泵导入时默认情况下创建索引是不使用并行的,所以这一步会消耗较长的时间,除了人工写脚本并行创建索引外,数据泵在导入时也可以并行创建索引,本文详细介绍了整个测试过程并得出测试结论。
测试环境为11204单实例:
首先创建测试表和测试索引:
然后并行导出,在导入时指定parallel等于4并设置sqlfile参数,查看生成的sql文本:
发现sql文本中并未使用并行:
接下来为了更直接的看出整个过程先开启系统级别的10046事件,再指定parallel等于4导入数据。
此时,在v$pq_slave视图中已经可以查看到并行进程,且并行度为8,并且状态为BUSY,几秒钟之后变成IDLE:
同时会产生8个并行进程的trace文件:
查看dbwn进程的trace文件,显示创建索引时已经指定parallel为4:
如下是p004进程的详细内容:
从trace文件中可以看出在并行创建索引时,产生了2个query slave set,分别是Q10000和Q10001,这时并行度就会乘于2变为8,从执行计划id=8和id=4中分别可以看出,一组用来扫描表,一组用来创建索引。 这也就是为什么我们指定parallel为4,而实际并行度为8的原因。
最后要关掉系统级别的10046事件,不然会产生非常多的trace文件:
测试导入时指定parallel等于1
可以看出数据库未生成并行的trace文件,也就是未并行创建索引:
测试在导出时不使用并行,然后导入时指定parallel参数等于4:
从trace文件可以看出,索引创建时使用了并行:
结论
1、数据泵在导入时一般情况下只需指定parallel>1即可在创建索引时候使用并行,导入时可以从trace文件中看到数据泵采用并行创建索引;
2、创建索引时并行度可能会等于parallel*2,这是因为oracle产生了两组query slave set,一组用来扫描表,一组用来创建索引;
3、如果数据泵带有sqlfile参数,得到的sql文本中并行度会显示为1,但是在实际导入时是可以并行创建的;
4、导出时未并行导出,导入时只要指定parallel参数同样可以并行创建索引;
5、如果不想并行创建索引,去掉parallel参数,或者指定 parallel=1即可。