首页 / 数据库 / MySQL / Oracle 11g RAC跨实例控制并行
在Oracle 10g RAC中的并行执行是由两个参数来控制的:instance_groups和parallel_instance_group这两个参数在Oracle 10g RAC中必须同时设置。instance_groups可以有多个值但是静态值,parallel_instance_group可以在系统级别与会话级别进行修改。在Oracle 10g RAC中,为了使用并行执行需要设置parallel_instance_group参数,并且parallel_instance_group的值必须是该实例instance_groups所指定的参数值之一。例如,有一个3节点的Oracle 10g RAC在spfile中有以下设置:
myrac1.instance_groups="rac","rac1"
myrac2.instance_groups="rac","rac2"
myrac3.instance_groups="rac","rac3"
myrac1.parallel_instance_group="rac1"#节点1的并行执行只能在节点1上运行
myrac2.parallel_instance_group="rac2"#节点2的并行执行只能在节点2上运行
myrac3.parallel_instance_group="rac3"#节点3的并行执行只能在节点3上运行在11gRAC中,因为向后兼容仍然可以使用instance_groups和parallel_instance_group参数。然而,在Oracle 11g RAC中不需要这样做,instance_groups参数已经被废弃并且保留只是为了向后兼容。在Oracle 11gRAC中并行查询子进程与服务集成在一起,因此不需要再设置instance_groups和parallel_instance_group参数。因为不需要设置instance_groups参数,而是可以直接设置服务名,
例如:alter session set parallel_instance_group=service_name。因为在11g中instance_groups参数已经被废弃,可以继续使用,但是它只是为了向后兼容。在Oracle 11g RAC中也可以不需要设置parallel_instance_groups参数来限制并行查询子进程在指定的实例上运行。如果以并行方式来执行SQL语句,那么缺省情况下并行进程只会在你通过服务名所连接到的数据库实例上运行。这不会影响其它的并行操作比如并行恢复或gv$视图的查询处理。为了覆盖这种行为,可以设置parallel_instance_group参数。可以使用srvctl add service命令来创建服务。例如,数据库名是rac且有2个实例,rac1和rac2。
对每个实例创建一个服务
[grid@rac1 ~]$ srvctl add service -d rac -s rac1 -r rac1 -a rac2
[grid@rac1 ~]$ srvctl add service -d rac -s rac2 -r rac2 -a rac1
[grid@rac1 ~]$ srvctl start service -d rac -s rac1
[grid@rac1 ~]$ srvctl start service -d rac -s rac2
上面的语句将创建两个服务,每个实例一个,-r参数指定首选实例,-a参数指定可用实例。
1.如果使用其中的一个服务连接数据库,并且没有显式地设置parallel_instance_groups参数,那么并行执行将被限制在你的连接的实例上执行例如,如果连接到rac1,因上连接到rac1实例,那么并行查询了进程将只能在rac1的r参数所指定的实例rac1上运行。
SQL> conn sys/system@rac1 as sysdbaSQL> select instance_name from v$instance;INSTANCE_NAME
----------------
rac1SQL> show parameter parallel_instance_groupNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_instance_group string
SQL> show parameter instance_groupsNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups stringSQL> show parameter parallel_degree_policyNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_degree_policy string auto
SQL> set timing on
SQL> set autotrace on
SQL> select /*+ parallel(t1,60) */ count(*) from t1; COUNT(*)
----------
11121536Elapsed: 00:00:41.25Execution Plan
----------------------------------------------------------
Plan hash value: 3110199320--------------------------------------------------------------------------------
------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time | T
Q |IN-OUT| PQ Distrib |--------------------------------------------------------------------------------
------------------------| 0 | SELECT STATEMENT | | 1 | 793 (0)| 00:00:01 |
| | || 1 | SORT AGGREGATE | | 1 | | |
| | || 2 | PX COORDINATOR | | | | |
| | || 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,
00 | P->S | QC (RAND) || 4 | SORT AGGREGATE | | 1 | | | Q1,
00 | PCWP | || 5 | PX BLOCK ITERATOR | | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWC | || 6 | TABLE ACCESS FULL| T1 | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWP | |--------------------------------------------------------------------------------
------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
- Degree of Parallelism is 60 because of hint
Statistics
----------------------------------------------------------
430 recursive calls
0 db block gets
281608 consistent gets
158184 physical reads
3328 redo size
425 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
21 sorts (memory)
0 sorts (disk)
1 rows processed
在执行时查询并行子进程的是否只在rac1上运行
SQL> SELECT inst_id,sid, event, seq#,p1,p2,p3, wait_time FROM gv$session_wait WHERE upper(event) like ("PX%") ORDER BY 1; INST_ID SID EVENT SEQ# P1 P2 P3 WAIT_TIME
---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ----------
1 29 PX Deq: Execution Msg 54 268566527 1 1113052640 -1
1 105 PX Deq: Execution Msg 2 268566527 1 1113043256 -1
1 43 PX Deq: Execution Msg 57 268566527 1 1113057500 0
1 44 PX Deq: Execution Msg 55 268566527 1 1011415624 -1
1 50 PX Deq: Execution Msg 45 268566527 1 1113065368 -1
1 53 PX Deq: Execution Msg 64 268566527 1 1113070008 0
1 54 PX Deq: Execute Reply 8603 200 1 0 0
1 55 PX Deq: Execution Msg 59 268566527 1 1113049700 -1
1 62 PX Deq: Execution Msg 68 268566527 1 1113067520 0
1 69 PX Deq: Execution Msg 53 268566527 1 1113068028 0
1 74 PX Deq: Execution Msg 60 268566527 1 1113066504 -1 INST_ID SID EVENT SEQ# P1 P2 P3 WAIT_TIME
---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ----------
1 79 PX Deq: Execute Reply 641 200 1 0 0
1 80 PX Deq: Execution Msg 59 268566527 1 1113068568 -1
1 81 PX Deq: Execution Msg 63 268566527 1 1113069048 -1
1 88 PX Deq: Execution Msg 59 268566527 1 1113051680 0
1 97 PX Deq: Execution Msg 46 268566527 1 1011409340 0
16 rows selected.
可以看到并行子进程全都是在实例rac1上运行。2.一旦创建这些服务名之后,服务名rac1和rac2可以作为parallel_instance_groups的参数值,不管你使用那个服务名来进行数据库连接例如,如果使用通用的数据库服务名rac来进行连接,发现连接到了rac1实例,那么并行子进程会在当前所连接的实例或所有实例上运行。
SQL> conn sys/system@rac as sysdbaSQL> select instance_name from v$instance;INSTANCE_NAME
----------------
rac1SQL> show parameter parallel_instance_groupNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_instance_group string
SQL> show parameter instance_groupsNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups stringSQL> show parameter parallel_degree_policyNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_degree_policy string auto
SQL> set timing on
SQL> set autotrace on
SQL> select /*+ parallel(t1,60) */ count(*) from t1; COUNT(*)
----------
11121536Elapsed: 00:00:41.25Execution Plan
----------------------------------------------------------
Plan hash value: 3110199320--------------------------------------------------------------------------------
------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time | T
Q |IN-OUT| PQ Distrib |--------------------------------------------------------------------------------
------------------------| 0 | SELECT STATEMENT | | 1 | 793 (0)| 00:00:01 |
| | || 1 | SORT AGGREGATE | | 1 | | |
| | || 2 | PX COORDINATOR | | | | |
| | || 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,
00 | P->S | QC (RAND) || 4 | SORT AGGREGATE | | 1 | | | Q1,
00 | PCWP | || 5 | PX BLOCK ITERATOR | | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWC | || 6 | TABLE ACCESS FULL| T1 | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWP | |--------------------------------------------------------------------------------
------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
- Degree of Parallelism is 60 because of hint
Statistics
----------------------------------------------------------
430 recursive calls
0 db block gets
281608 consistent gets
158184 physical reads
3328 redo size
425 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
21 sorts (memory)
0 sorts (disk)
1 rows processed
在执行时查询并行子进程的是否只在rac1上运行
SQL> SELECT inst_id,sid, event, seq#,p1,p2,p3, wait_time FROM gv$session_wait WHERE upper(event) like ("PX%") ORDER BY 1;
INST_ID SID EVENT SEQ# P1 P2 P3 WAIT_TIME
---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ----------
1 29 PX Deq: Execution Msg 43 268566527 1 1113052640 0
1 33 PX Deq: Execute Reply 60924 200 1 0 0
1 104 PX Deq: Execution Msg 51 268566527 1 1113063216 0
1 103 PX Deq: Execution Msg 48 268566527 1 1011409820 0
1 101 PX Deq: Execution Msg 53 268566527 1 1113042688 0
1 100 PX Deq: Execution Msg 53 268566527 1 1011414604 0
1 99 PX Deq: Execution Msg 54 268566527 1 1113050660 0
1 91 PX Deq: Execution Msg 59 268566527 1 1113054620 0
1 90 PX Deq: Execution Msg 47 268566527 1 1011408860 0
1 88 PX Deq: Execution Msg 60 268566527 1 1113043256 0
1 87 PX Deq: Execution Msg 45 268566527 1 1113046760 0
1 86 PX Deq: Execution Msg 52 268566527 1 1113065936 0
1 85 PX Deq: Execution Msg 45 268566527 1 1113062708 0
1 84 PX Deq: Execution Msg 59 268566527 1 1011409340 0
1 83 PX Deq: Execution Msg 45 268566527 1 1113043764 0
1 82 PX Deq: Execution Msg 46 268566527 1 1113059480 0
1 81 PX Deq: Execution Msg 52 268566527 1 1113064800 0
1 80 PX Deq: Execution Msg 43 268566527 1 1113066504 0
1 76 PX Deq: Execution Msg 61 268566527 1 1113056540 0
1 69 PX Deq: Execution Msg 48 268566527 1 1113067012 0
1 68 PX Deq: Execution Msg 48 268566527 1 1113049700 0
1 66 PX Deq: Execution Msg 61 268566527 1 1011415624 0
1 64 PX Deq: Execution Msg 2 268566527 1 1113068028 -1
1 62 PX Deq: Execution Msg 39 268566527 1 1113067520 0
1 59 PX Deq: Execution Msg 49 268566527 1 1113044840 0
1 58 PX Deq: Execution Msg 47 268566527 1 1113048740 0
1 57 PX Deq: Execution Msg 50 268566527 1 1113064232 0
1 54 PX Deq: Execute Reply 11610 200 1 0 0
1 53 PX Deq: Execution Msg 52 268566527 1 1113065368 0
1 43 PX Deq: Execution Msg 42 268566527 1 1113047780 0
2 80 PX Deq: Execution Msg 133 268566527 2 1112541100 0
2 83 PX Deq: Execution Msg 119 268566527 2 1112529160 0
2 78 PX Deq: Execution Msg 107 268566527 2 1112534620 0
2 77 PX Deq: Execution Msg 144 268566527 2 1112535100 0
2 76 PX Deq: Execution Msg 146 268566527 2 1112540140 0
2 74 PX Deq: Execution Msg 118 268566527 2 1112530660 0
2 73 PX Deq: Execution Msg 150 268566527 2 1112536660 0
2 72 PX Deq: Execution Msg 125 268566527 2 1112531140 0
2 71 PX Deq: Execution Msg 157 268566527 2 1112533660 0
2 70 PX Deq: Execution Msg 146 268566527 2 1112530180 0
2 69 PX Deq: Execution Msg 135 268566527 2 1112532640 0
2 67 PX Deq: Execution Msg 128 268566527 2 1112556120 0
2 66 PX Deq: Execution Msg 135 268566527 2 1112532100 0
2 65 PX Deq: Execution Msg 124 268566527 2 1112555640 0
2 63 PX Deq: Execution Msg 126 268566527 2 1112528620 0
2 62 PX Deq: Execution Msg 183 268566527 2 1112537140 0
2 60 PX Deq: Execution Msg 182 268566527 2 1112541580 0
2 59 PX Deq: Execution Msg 103 268566527 2 1112535580 0
2 58 PX Deq: Execution Msg 160 268566527 2 1112539600 0
2 57 PX Deq: Execution Msg 164 268566527 2 1112538580 0
2 56 PX Deq: Execution Msg 124 268566527 2 1112527528 0
2 53 PX Deq: Execution Msg 145 268566527 2 1112539060 0
2 49 PX Deq: Execution Msg 140 268566527 2 1112538100 0
2 37 PX Deq: Execution Msg 112 268566527 2 1112537620 0
2 36 PX Deq: Execution Msg 153 268566527 1 1112536120 0
2 34 PX Deq: Execution Msg 14 268566527 2 1112531620 -1
2 81 PX Deq: Execution Msg 157 268566527 2 1112533180 0
2 79 PX Deq: Execution Msg 128 268566527 2 1112557244 058 rows selected.
从上面的信息可以看到通过通用服务名rac虽然连接到的实例是rac1,在执行并行查询时并行子进程在实例rac1与rac2上运行,并不是只在rac1实例上运行。如果你想限制你的查询只在rac1实例上执行,那么执行
alter session set parallel_instance_group=rac1命令,这将限制并行子进程只在指定服务名所相关的实例上运行,比如rac1。
SQL> alter session set parallel_instance_group="rac1";Session altered.SQL> show parameter parallel_instance_groupNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_instance_group string rac1SQL> select /*+ parallel(t1,60) */ count(*) from t1; COUNT(*)
----------
11121536Elapsed: 00:00:41.25Execution Plan
----------------------------------------------------------
Plan hash value: 3110199320--------------------------------------------------------------------------------
------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time | T
Q |IN-OUT| PQ Distrib |--------------------------------------------------------------------------------
------------------------| 0 | SELECT STATEMENT | | 1 | 793 (0)| 00:00:01 |
| | || 1 | SORT AGGREGATE | | 1 | | |
| | || 2 | PX COORDINATOR | | | | |
| | || 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,
00 | P->S | QC (RAND) || 4 | SORT AGGREGATE | | 1 | | | Q1,
00 | PCWP | || 5 | PX BLOCK ITERATOR | | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWC | || 6 | TABLE ACCESS FULL| T1 | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWP | |--------------------------------------------------------------------------------
------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
- Degree of Parallelism is 60 because of hint
Statistics
----------------------------------------------------------
430 recursive calls
0 db block gets
281608 consistent gets
158184 physical reads
3328 redo size
425 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
21 sorts (memory)
0 sorts (disk)
1 rows processedSQL> SELECT inst_id,sid, event, seq#,p1,p2,p3, wait_time FROM gv$session_wait WHERE upper(event) like ("PX%") ORDER BY 1; INST_ID SID EVENT SEQ# P1 P2 P3 WAIT_TIME
---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ----------
1 43 PX Deq: Execution Msg 61 268566527 2 1113060496 0
1 53 PX Deq: Execution Msg 71 268566527 2 1011415624 0
1 54 PX Deq: Parse Reply 28202 200 1 0 -1
1 55 PX Deq: Execution Msg 64 268566527 1 1011418240 0
1 57 PX Deq: Execution Msg 88 268566527 1 1113048740 0
1 58 PX Deq: Execution Msg 53 268566527 1 1113061632 0
1 62 PX Deq: Execution Msg 66 268566527 3 1011420904 0
1 64 PX Deq: Execution Msg 58 268566527 1 1011407468 0
1 66 PX Deq: Execution Msg 75 268566527 2 1113061124 0
1 67 PX Deq: Execution Msg 2 268566527 1 1113079488 -1
1 68 PX Deq: Execution Msg 76 268566527 2 1011417732 0
1 69 PX Deq: Execution Msg 56 268566527 3 1011420424 0
1 76 PX Deq: Execution Msg 70 268566527 1 1011408860 0
1 79 PX Deq: Execute Reply 672 200 1 0 0
1 80 PX Deq: Execution Msg 75 268566527 1 1011419944 0
1 81 PX Deq: Execution Msg 75 268566527 1 1011409340 0
1 82 PX Deq: Execution Msg 63 268566527 1 1113054620 0
1 83 PX Deq: Execution Msg 62 268566527 2 1011407948 0
1 85 PX Deq: Execution Msg 65 268566527 3 1113049700 0
1 86 PX Deq: Execution Msg 54 268566527 2 1113047780 0
1 88 PX Deq: Execution Msg 65 268566527 3 1113059480 0
1 90 PX Deq: Execution Msg 83 268566527 2 1113049220 0
1 91 PX Deq: Execution Msg 65 268566527 1 1113052640 0
1 101 PX Deq: Execution Msg 69 268566527 2 1113053600 0
1 102 PX Deq: Execution Msg 56 268566527 2 1113056540 0
1 103 PX Deq: Execution Msg 70 268566527 2 1113044840 0
1 104 PX Deq: Execution Msg 70 268566527 2 1113046760 0
28 rows selected.
可以看到在设置parallel_instance_group="rac1"后,并行子进程只能在实例rac1上运行了。3.如果连接的服务名运行在两个实例上,比如:srvctl add service -d rac -s rac -r rac1,rac2那么,并行查询的并行子进程将会运行在两个实例上,不管你所连接的是那个实例。
SQL> conn sys/system@rac as sysdbaSQL> select instance_name from v$instance;INSTANCE_NAME
----------------
rac2SQL> show parameter parallel_instance_groupNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_instance_group string
SQL> show parameter instance_groupsNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups stringSQL> show parameter parallel_degree_policyNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_degree_policy string auto
SQL> set timing on
SQL> set autotrace on
SQL> select /*+ parallel(t1,60) */ count(*) from t1; COUNT(*)
----------
11121536Elapsed: 00:00:41.25Execution Plan
----------------------------------------------------------
Plan hash value: 3110199320--------------------------------------------------------------------------------
------------------------| Id | Operation | Name | Rows | Cost (%CPU)| Time | T
Q |IN-OUT| PQ Distrib |--------------------------------------------------------------------------------
------------------------| 0 | SELECT STATEMENT | | 1 | 793 (0)| 00:00:01 |
| | || 1 | SORT AGGREGATE | | 1 | | |
| | || 2 | PX COORDINATOR | | | | |
| | || 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,
00 | P->S | QC (RAND) || 4 | SORT AGGREGATE | | 1 | | | Q1,
00 | PCWP | || 5 | PX BLOCK ITERATOR | | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWC | || 6 | TABLE ACCESS FULL| T1 | 10M| 793 (0)| 00:00:01 | Q1,
00 | PCWP | |--------------------------------------------------------------------------------
------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
- Degree of Parallelism is 60 because of hint
Statistics
----------------------------------------------------------
430 recursive calls
0 db block gets
281608 consistent gets
158184 physical reads
3328 redo size
425 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
21 sorts (memory)
0 sorts (disk)
1 rows processedSQL> SELECT inst_id,sid, event, seq#,p1,p2,p3, wait_time FROM gv$session_wait WHERE upper(event) like ("PX%") ORDER BY 1;
INST_ID SID EVENT SEQ# P1 P2 P3 WAIT_TIME
---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ----------
1 29 PX Deq: Execution Msg 43 268566527 1 1113052640 0
1 33 PX Deq: Execute Reply 60924 200 1 0 0
1 104 PX Deq: Execution Msg 51 268566527 1 1113063216 0
1 103 PX Deq: Execution Msg 48 268566527 1 1011409820 0
1 101 PX Deq: Execution Msg 53 268566527 1 1113042688 0
1 100 PX Deq: Execution Msg 53 268566527 1 1011414604 0
1 99 PX Deq: Execution Msg 54 268566527 1 1113050660 0
1 91 PX Deq: Execution Msg 59 268566527 1 1113054620 0
1 90 PX Deq: Execution Msg 47 268566527