oracle並行的小細節
今天在從生產環境中做一個資料抽取,為了提高效率,加了並行。發現了一些小的細節。
首先,抽取資料時,對於並行度的指定我是設定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
-------------
在稍候的工作繼續觀察,看能不能得到一些驚喜。
首先,抽取資料時,對於並行度的指定我是設定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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小細節
- 提高javascript效能的小細節JavaScript
- Vue、Javascript小細節VueJavaScript
- oracle中update的細節Oracle
- 機器級程式的小細節
- 一個小的技術細節
- Oracle11gRAC跨節點 並行查詢的控制Oracle並行
- 看FCOS時的小細節總結
- Vue.js 和 MVVM 的小細節Vue.jsMVVM
- 筆記——Android 中的小細節筆記Android
- Oracle with as使用小節Oracle
- Oracle的並行Oracle並行
- 你需要注意的Java小細節(一)Java
- 責任 執行 細節
- 開發小細節系列之一
- oracle的並行世界Oracle並行
- Oracle中的並行Oracle並行
- Oracle SQL細節總結(一)OracleSQL
- JS 一些優化效能的小細節JS優化
- RAC中的跨節點並行[轉]並行
- 看不見的設計——關於“分享”的小細節
- Oracle並行操作——並行DML操作Oracle並行
- 函式解構引數小細節函式
- Java細緻末節小錯記錄Java
- Integer類小細節隨筆記錄筆記
- RAC中跨節點並行並行
- oracle經驗小節2Oracle
- Oracle的並行操作[轉]Oracle並行
- Oracle並行操作——淺議使用並行的時機Oracle並行
- 不要忽視Web程式設計中的小細節Web程式設計
- Oracle並行操作——從序列到並行Oracle並行
- Oracle細節及難點總結Oracle
- oracle並行程式小結Oracle並行行程
- Oracle並行FAQOracle並行
- Vue 2升級 Vue 3初探小細節Vue
- Java小細節:List可以add(null)嗎?JavaNull
- 13. iOS開發小細節--OC篇iOS
- rac中控制節點間並行並行