oracle parallel execution example

引子:以前一直沒太關注oracle並行這個特性。前幾天一個兄弟碰到的一個問題,才讓我覺得這個東西還是有很多需要注意的地方,有必要仔細熟悉下。其實碰到的問題不復雜:
類似如下的一條語句:insert into xxxx select /*+parallel(a) */ * from xxx a;數據量大約在75G左右,這位兄弟從上午跑到下午還沒跑完,過來問我咋回事,說平常2hrs能跑完的東西跑了好幾個小時還撒動靜。查看系統性能也比較 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉強湊合),但平均寫速度只有10M不到。等待事件裏面大量的‘ ‘PX Deq Credit: send blkd’,這裏能看出並行出了問題,從而最後得知是並行用法有問題,修改之後20分鐘完成了該操作。正確的做法應該是:
alter session enable dml parallel;

insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;

因爲oracle默認並不會打開PDML,對DML語句必須手工啓用。 另外不得不說的是,並行不是一個可擴展的特性,只有在數據倉庫或作爲DBA等少數人的工具在批量數據操作時利於充分利用資源,而在OLTP環境下使用並行 需要非常謹慎。事實上PDML還是有比較多的限制的,例如不支持觸發器,引用約束,高級複製和分佈式事務等特性,同時也會帶來額外的空間佔用,PDDL同 樣是如此。有關Parallel excution可參考官方文檔,在Thomas Kyte的新書《Expert Oracle Database architecture》也有精闢的講述。



………………………………………………………………………………………………………………
………………………………………………………………………………………………………………

我在其中一個SESSION 執行
SQL> create table test3 parallel 4 as select * from test1;

表已創建。

SQL> select * from v$mystat where rownum=1;

SID STATISTIC# VALUE
---------- ---------- ----------
151 0 1

SQL>


然後立刻在另一SESSION 乘上一個執行沒結束,看下面,這麼說是有4個並行的進程在處理了
SQL> select * from v$px_session;


SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE
-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------
6D31E434 131 16 151 107 1 1 1 1 4 4
6D32421C 136 11 151 107 1 1 1 2 4 4
6D3267AC 138 18 151 107 1 1 1 3 4 4
6D31F6FC 132 11 151 107 1 1 1 4 4 4
6D335BD4 151 107 151

SQL> select * from v$mystat where rownum=1;

SID STATISTIC# VALUE
---------- ---------- ----------
137 0 1

SQL>


我加大後

SQL> /

SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE
-------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ----------
6D31864C 126 10 151 107 1 1 1 1 7 10
6D31F6FC 132 17 151 107 1 1 1 2 7 10
6D32421C 136 15 151 107 1 1 1 3 7 10
6D3267AC 138 22 151 107 1 1 1 4 7 10
6D322F54 135 11 151 107 1 1 1 5 7 10
6D31E434 131 18 151 107 1 1 1 6 7 10
6D327A74 139 5 151 107 1 1 1 7 7 10
6D335BD4 151 107 151

已選擇8行。

SQL>

奇怪,怎麼看只有7個,我那裏可是寫成
SQL> create table test4 parallel 10 as select * from test1;

表已創建。


怎麼少了3個?


不過我實際只有一個CPU的機器,這些說明什麼問題呢?

BTW

SQL> SHOW Parameter parallel_max

NAME TYPE VALUE
------------------------------------ ---------------------- -------------------
parallel_max_servers integer 20
SQL>


……………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………
開多少個parallel server也要看當時系統的負載,並行是很耗系統資源的,

這個並行度和你初始化參數有關。CPU_COUNT 、PARALLEL_THREADS_PER_CPU 等等都有關係。如果你建表的時候沒有明確指定並行度,那麼oracle會自動的根據需要設定並行度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章