ORACLE ORA-00020與parallel並行

清風艾艾發表於2016-06-06
  6月份巡檢中,石家莊Oracle資料庫告警日誌發現ORA-00020: maximum number of processes (300) exceeded,提取告警時間段的AWR,觀察發現:PX Deq: Slave Session Stats等待事件

  觀察sql統計資訊發現insert-select並行的SQL語句,如下所示:

 經過與開發核實,發現在一個儲存過程包中,有10條insert-select並行sql語句,並且在儲存過程的最後一個insert完成做提交。這導致並行SQL語句申請過多的程式,進而導致資料庫程式數超過最大數。以下是配合開發在測試資料庫做的insert-select並行測試。
 當去掉/*+parallel*/時,透過觀察oracle等待事件,沒有發現任何並行的等待事件。

 當設定/*+parallel 4*/時,透過觀察oracle等待事件、程式,以及透過sql_id查詢出的sql文字發現,在大部分情況下,oracle會小於4+1個程式數的方式執行sql,但是在很短的時間內,oracle啟動的程式數仍有可能會大於限制的程式數。如下圖,在開4個parallel的情況下,sql執行過程中也出現了啟動了8個並行程式的時候。
後臺捕獲到的insert-select的sql語句:

insert-select(parallel 4 )時等待事件:

insert-select(parallel 4 )時,並行程式峰值有8個程式同時進行

   另外,經過實驗驗證:當insert-select(parallel)不加並行限制時,default情況下,並行數為cpu(個數)*parallel_threads_per_cpu(每個cpu允許的並行程式數),監控sql執行過程可以發現,在大部分情況下,oracle會小於16+1個程式數的方式執行sql,在很短的時間內,oracle啟動的程式數可能會大於限制的程式數。
   因此,在insert-select並行使用過程中,要結合資料庫伺服器CPU實際情況,對parallel做限制,防止程式數使用達到最大值而導致資料庫服務不可用。另外oracle提供一個引數parallel_max_servers=n,即當前例項總共啟動的並行服務程式不能超過這個引數的設定值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2114692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章