oracle 之 控制oracle RAC 進行並行運算
RAC的一大優點就是可以跨節點進行平行計算,那麼如何控制並行運算?這就是這篇文章要討論的內容。
10 g 中:
合理設定跨節點並行,需要先設定一些引數:
instance_groups:這個引數主要是設定該節點例項是否屬於某一個例項組。每個節點可以設定多個不同的例項組名,例項組名用逗號隔開。
parallel_instance_group設定的值為instance_groups裡面設定的值,表明這個節點上面進行的並行操作可以跨越哪些例項組。
alter system set instance_groups='dw','dw1','dw123','dw124','dw134' scope=spfile sid='dwrac1';
alter system set instance_groups='dw','dw2','dw123','dw124','dw234' scope=spfile sid='dwrac2';
alter system set instance_groups='dw','dw3','dw123','dw134','dw234' scope=spfile sid='dwrac3';
alter system set instance_groups='dw','dw4','dw124','dw134','dw234' scope=spfile sid='dwrac4';
以上引數分別為4個節點定義了5個instance group,有的group包含多個節點,有的group只包含一個節點。
一、跨所有節點執行
分兩種情況進行測試:instance_groups包含所有節點和instance_groups只包含一個節點。
1. instance_groups包含所有節點
1). 節點2引數設定情況
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
只定義了instance_groups,不設定parallel_instance_group。
前面我們設定過,dw這個instance_group包含了所有的節點。
2). 在節點2發出查詢
admin@dwrac2> select /*+ parallel(a,128) */count(1) from testuser.big_table a;
3). 另開一個視窗查詢並行程式情況
SQL> select INST_ID,COUNT(1) from gv$px_session p where (p.inst_id,p.sid) in (select s.inst_id,s.sid from gv$session s where s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 32
2 33
4 32
3 32
可以看到,並行會話(parallel slaves)平均分配到4個節點上。節點2多一個程式是因為它是並行查詢的發起者,額外的會話是發起會話,也就是並行查詢協調器(parallel query coordinator),其餘的是並行從屬程式。
之所有能分配到4個節點上,是因為4個節點都屬於dw這個instance group,且都沒有設定parallel_instance_group。
2. instance_groups只包含一個節點
1). 修改引數
admin@dwrac2> alter system set instance_groups='dw2' scope=spfile sid='dwrac2';
重啟
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw2
parallel_instance_group string
不設定parallel_instance_group,且instance_group=dw2只包含節點2.
2). 發出並行查詢
admin@dwrac2> select /*+ parallel(a,128) */count(1) from testuser.big_table a;
3). 另開一個視窗查詢並行程式情況
SQL> select INST_ID,COUNT(1) from gv$px_session p where (p.inst_id,p.sid) in (select s.inst_id,s.sid from gv$session s where s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 32
2 33
4 32
3 32
可以看到,即使是instance_groups='dw2'只在節點2出現,但是如果不設定parallel_instance_group,並行仍然可以跨越所有節點。
二、跨部分節點執行
這部分分兩種測試:發出命令的節點屬於parallel_instance_group的一員以及發出命令的節點不屬於parallel_instance_group
1. 發出命令的節點屬於parallel_instance_group的一員
1). 在節點2修改引數
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
admin@dwrac2> alter session set parallel_instance_group='dw2';
Session altered.
--這個設定的會強制並行操作只會屬於dw2這個instance group的節點中執行。
--注意:parallel_instance_group是大小寫區分的,如果用alter session set parallel_instance_group=dw2,則不會起任何並行程式,因為不加單引號的話,實際上載後臺dw2會被轉換成大寫的DW2,不屬於任何一個instance group。
2). 在節點2發出同樣的查詢
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
3). 另起一個會話查詢並行情況
SQL> select INST_ID,COUNT(1) from gv$px_session p where (p.inst_id,p.sid) in (select s.inst_id,s.sid from gv$session s where s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
2 129
可以看到,因為只有節點2屬於dw2這個instance group,所有並行會話都分佈在節點2上。
2. 發出命令的節點不屬於parallel_instance_group
1) 在節點2修改引數
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
admin@dwrac2> alter session set parallel_instance_group='dw1';
Session altered.
根據我們之前的設定,只有節點1屬於dw1這個instance group。
2) 在節點2發出查詢
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
3) 新開一個會話查詢並行程式資訊
SQL> select INST_ID,COUNT(1) from gv$px_session p where (p.inst_id,p.sid) in (select s.inst_id,s.sid from gv$session s where s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 128
2 1
可以看到,除了並行查詢協調器(也就是發出查詢命令的會話)外,所有並行程式都執行在節點1上。
這也說明了,即使發出並行查詢指令的節點不屬於parallel_instance_group,但它仍然可以呼叫屬於parallel_instance_group的節點資源。
admin@dwrac2> alter session set parallel_instance_group='dw134';
Session altered.
Elapsed: 00:00:00.00
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
SQL> select INST_ID,COUNT(1) from gv$px_session p where (p.inst_id,p.sid) in (select s.inst_id,s.sid from gv$session s where s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 42
2 1
4 42
3 44
總結一下:
1. RAC可以透過instance_groups和parallel_instance_group來靈活控制如何跨節點進行並行運算。
2. parallel_instance_group區分大小寫。如果設定的parallel_instance_groups值不屬於整個cluster的任意一個instance_groups設定值,則Oracle只會序列執行操作,不會啟用並行。
3. 如果不設定parallel_instance_group,不管instance_group如何設定,並行可以跨越所有節點
4. 如果某個節點設定了有效的parallel_instance_group,則在該節點發出的並行操作可以執行在parallel_instance_groups包含的所有節點上,不管parallel_instance_groups的節點是否包含發出命令的節點。
也就是說並行會話執行在那些節點只與instance_groups和parallel_instance_groups有關,與命令在那個節點發出無關。
5. 一般建議設定好合適的instance_groups,但不要在系統級設定parallel_instance_groups,根據實際情況在會話級設定parallel_instance_groups引數。
6. 以下是一些例子及說明
dwrac1.instance_groups='dw','dw1','dw123','dw124','dw134'
dwrac2.instance_groups='dw','dw2','dw123','dw124','dw234'
dwrac3.instance_groups='dw','dw3','dw123','dw134','dw234'
dwrac4.instance_groups='dw','dw4','dw124','dw134','dw234'
dwrac1.parallel_instance_groups='' --節點1發起的平行計算請求的會話可跨越所有節點執行
dwrac1.parallel_instance_groups='dw' --節點1發起的平行計算請求的會話可跨越所有節點執行
dwrac1.instance_groups='dw1' --節點1發起的平行計算請求的會話只可在節點1執行
dwrac1.instance_groups='dw2' --節點1發起的平行計算請求的會話只可在節點2執行
dwrac2.instance_groups='dw134' ----節點2發起的平行計算請求的會話只可在節點1/3/4上執行
dwrac1.instance_groups='other' --不會啟用並行
轉:http://www.cnblogs.com/ylqmf/archive/2012/03/16/2400126.html
11 g 中:
11g 資料庫中,並行會話預設使用的是 shared pool 用於並行執行時的訊息緩衝區,
並行過多時容易造成 shared pool 不足,使資料庫報 ORA-4031 錯誤。將這個引數設定為
true,使並行會話改為使用 large pool。
1、-- 調整 Px 操作使用 shared pool
alter system set "_px_use_large_pool"=true sid ='*' scope=spfile;
2、-- RAC 引數調整 parallel_force_local
該 11g 的新增引數,用於將並行的 slave 程式限制在發起並行 SQL 的會話所在的
節點,即避免跨節點並行產生大量的節點間資料交換和引起效能問題。該引數取代 11g
之前的 instance_groups 和 parallel_instance_group 兩個引數。
alter system set parallel_force_local=true sid='*' scope=spfile;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2144260/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 11g RAC跨例項控制並行Oracle並行
- Oracle 10g RAC跨例項控制並行Oracle 10g並行
- rac中控制節點間並行並行
- Oracle並行操作——並行DML操作Oracle並行
- 使用位運算進行加法運算
- Oracle並行FAQOracle並行
- Oracle的並行Oracle並行
- Oracle並行操作——從序列到並行Oracle並行
- Oracle 11.2中控制並行的新引數Oracle並行
- oracle的並行世界Oracle並行
- Oracle中的並行Oracle並行
- Oracle並行操作——並行查詢(Parallel Query)Oracle並行Parallel
- 手動進行oracle rac vip 漂移的步驟 。Oracle
- 使用OSB進行ORACLE rac資料庫的備份Oracle資料庫
- Oracle並行基礎一Oracle並行
- Oracle並行基礎二Oracle並行
- Oracle Redo 並行機制Oracle Redo並行
- Oracle的並行操作[轉]Oracle並行
- Oracle並行新增主鍵Oracle並行
- Oracle“並行執行”——監控檢視Oracle並行
- 如何取得Oracle並行執行的traceOracle並行
- Oracle並行操作——淺議使用並行的時機Oracle並行
- Oracle11gRAC跨節點 並行查詢的控制Oracle並行
- 一種支援多種並行環境的柵格地理計算並行運算元並行
- Oracle 中的並行系列(一)Oracle並行
- oracle並行的小細節Oracle並行
- oracle建立job並執行jobOracle
- oracle的Parallel 並行技術OracleParallel並行
- ORACLE 集合運算Oracle
- Oracle 普通Table進行ReorgOracle
- GPU的並行運算與CUDA的簡介GPU並行
- oracle表查詢的並行度Oracle並行
- 深入理解Oracle的並行操作Oracle並行
- oracle11g 自動並行Oracle並行
- oracle 並行查詢時並行資源分配追蹤測試Oracle並行
- 使用陣列進行大資料運算陣列大資料
- 在oracle 叢集多例項中執行並行操作Oracle並行
- oracle goldengate 在節點之間進行 遷移OracleGo