這也就是為什么我們指定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即可。
????????????????????????????????????????