2012-05-02 49 views
6

我有一個這樣的SQL:有關Oracle並行插入性能

Insert into A 
Select * from B; 

現在我想它並行運行。我的問題是並行插入或選擇或兩者?請參閱以下sqls,你能告訴我哪一個是正確的,哪一個是最好的。我沒有dba許可,所以我不能檢查其執行計劃。

1)Insert /*+ parallel(A 6) */ into A select * from B;

2)Insert into A select/*+ parallel(B 6) */ * from B;

3)Insert /*+ parallel(A 6) */ into A select /*+ parallel(B 6) */ * from B;

謝謝!

+0

無論如何,並行可能不會幫助你在這種情況下。由於幾乎不需要處理,IO將成爲瓶頸(除非你已經簡化了)。看看'INSERT/* + APPEND */....'如果它是一個選項 – Phil

+0

@Phil並行執行可以顯着提高IO。 –

回答

12

並行化INSERTSELECT是最快的。

(如果你有大量的數據量足夠,你有一個像樣的服務器,一切都在三立配置等)

你肯定會想測試它自己,尤其是找到最佳的程度並行性。關於Oracle並行執行有很多神話,甚至手冊有時也是horribly wrong

在11gR2中,我會建議你運行你的說法是這樣的:

alter session enable parallel dml; 
insert /*+ append parallel(6) */ into A select * from B; 
  1. 你總是想先啓用並行DML。使用statement-level parallelism代替對象級別的並行性。這是一個11gR2功能,可讓您輕鬆地同時運行所有內容,無需擔心對象別名或訪問方法。對於10G,你將不得不使用多個提示。
  2. 通常append提示是沒有必要的。如果您的DML並行運行,它將自動使用直接路徑插入。但是,如果您的聲明降級爲串行(例如,如果沒有可用的並行服務器),則提示可能會產生很大變化。
+2

值得注意的是,並行插入或直接路徑串行插入(append)在表(或插入發生的指定分區)上執行排它鎖。 –

1

您不需要DBA權限來運行解釋計劃。我相信SELECT_CATALOG是正確的特權。