oracle並行的小細節

dbhelper發表於2014-11-26
今天在從生產環境中做一個資料抽取,為了提高效率,加了並行。發現了一些小的細節。
首先,抽取資料時,對於並行度的指定我是設定200M為一個單位,如果表有1G,那麼就需要啟5個並行,結果有一個表有40G,按照這個單位,需要200個並行。
但是在實際中,ddl的執行並行度,資料庫不一定會買賬,首先從資料庫例項層面有一些引數限定。
這下面的配置中,這個庫最多隻能使用64個並行。
SQL> show parameter parall
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback         string      LOW
parallel_adaptive_multi_user         boolean     FALSE
parallel_automatic_tuning            boolean     FALSE
parallel_degree_limit                string      CPU
parallel_degree_policy               string      MANUAL
parallel_execution_message_size      integer     65536
parallel_force_local                 boolean     FALSE
parallel_instance_group              string
parallel_io_cap_enabled              boolean     FALSE
parallel_max_servers                 integer     64

為了保險起見,我指定了抽取資料時的那個ddl的並行度為30,但是實際執行的時候只啟用了8個。
USERNAME         TOTAL_CNT     ACTIVE   INACTIVE     KILLED     SNIPED JDBC Thin Client 
--------------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------- -----------
TMP_MIG                  9          9          0          0          0                0              
但是可以注意到一個細節,實際中只啟用了8個並行,但是在資料庫裡的對應的session卻有9個。
來看看session的情況,第一個session是透過sqlplus連進來的,剩下的都是和並行繫結的session.
      SID    SERIAL# USERNAME                       MACHINE                                                          PROGRAM
---------- ---------- ------------------------------ ---------------------------------------------------------------- ------------------------------------------------
      4163      36087 TMP_MIG                        prod_db                                                         sqlplus@prod_db (TNS V1-V3)
      4383      17193 TMP_MIG                        prod_db                                                         oracle@prod_db (P048)
      4568      13403 TMP_MIG                        prod_db                                                         oracle@prod_db (P049)
      4750      15373 TMP_MIG                        prod_db                                                         oracle@prod_db (P050)
      4956       8551 TMP_MIG                        prod_db                                                         oracle@prod_db (P052)
      5107      11535 TMP_MIG                        prod_db                                                         oracle@prod_db (P051)
      5329      12139 TMP_MIG                        prod_db                                                         oracle@prod_db (P053)
      5492      21119 TMP_MIG                        prod_db                                                         oracle@prod_db (P054)
      5698      14709 TMP_MIG                        prod_db                                                         oracle@prod_db (P055)

如果啟用後的有些並行session處理的快,會馬上釋放對應的session,session就會處於inactive狀態。
在資料抽取執行了一會以後,來檢視session的情況,發現有7個session處於Inactive狀態了。
USERNAME         TOTAL_CNT     ACTIVE   INACTIVE     KILLED     SNIPED JDBC Thin Client 
--------------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------- -----------
TMP_MIG                  9          2          7          0          0                0             

當然了,可以看到oracle的並行似乎是採用了多個session(多個session對應指定的parallel)來處理資料。

其實我更關心parallel的這些session都做些什麼。來嘗試一下看看它們正在執行的sql,倒底是什麼,嘗試了多個session,都沒有找到,看來oracle是不想讓我們知道這些細節了。

SQL> select prev_sql_id sql_id from v$session where sid=4383;
SQL_ID
-------------

SQL> c/4383/5698
  1* select prev_sql_id sql_id from v$session where sid=5698
SQL> /

SQL_ID
-------------


在稍候的工作繼續觀察,看能不能得到一些驚喜。

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

相關文章