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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小細節
- oracle的並行世界Oracle並行
- Vue、Javascript小細節VueJavaScript
- 機器級程式的小細節
- 一個小的技術細節
- Oracle並行FAQOracle並行
- Oracle 中的並行系列(一)Oracle並行
- Oracle細節及難點總結Oracle
- 看FCOS時的小細節總結
- oracle表查詢的並行度Oracle並行
- Oracle中的並行系列(二):你設定的並行真的生效了嗎?Oracle並行
- Oracle“並行執行”——監控檢視Oracle並行
- 函式解構引數小細節函式
- Java小細節:List可以add(null)嗎?JavaNull
- Integer類小細節隨筆記錄筆記
- Java細緻末節小錯記錄Java
- 13. iOS開發小細節--OC篇iOS
- Vue 2升級 Vue 3初探小細節Vue
- oracle 並行查詢時並行資源分配追蹤測試Oracle並行
- mysql資料庫操作之------查的各種小細節MySql資料庫
- 第16節:基於WRITESET的並行複製方式並行
- vue 元件(component)命名的小細節問題(大小寫問題)Vue元件
- 慢慢細談Android 面試的細節Android面試
- 節路月在並心石起於小算mte
- EfficientNet模型的完整細節模型
- ClusterShell:一個在叢集節點上並行執行命令的好工具並行
- 執行緒池中你不容錯過的一些細節執行緒
- 第19節 從庫MTS多執行緒並行回放(一)執行緒並行
- 第20節 從庫MTS多執行緒並行回放(二)執行緒並行
- 思考一個小細節,從如何反轉字典說起
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- [JAVA] Java switch的使用細節Java
- Docker映象細節Docker
- 理理Vue細節Vue
- 細節總結
- MyBatis摳細節MyBatis
- OpenFeign 使用細節
- Wise 打包細節
- 從Hash Join的執行計劃的細節中能看到點啥