在Oracle 10g RAC中的并行执行由两个参数:instance_groups和parallel_instance_group来控制。并且这两个参数必须同时使用才能生效。
instance_groups可以设置多个参数值,但它是静态参数,parallel_instance_groups可以在系统级别和会话级别运态进行修改。
在Oracle 10g RAC中,为了让并行执行可以在设置了parallel_instance_group参数的会话中执行,那么parallel_instance_group的参数值必须是该实例instance_groups参数列表中的一个。
例如,两节点的Oracle 10g RAC,在spfile文件中有以下设置
myrac1.instance_groups=’jyrac’,’jyrac1′
myrac2.instance_groups=’jyrac’,’jyrac2′
myrac1.parallel_instance_group=’jyrac1’#节点1的并行执行只能在节点1上运行
myrac2.parallel_instance_group=’jyrac2’#节点2的并行执行只能在节点2上运行
SQL> alter system set instance_groups='jyrac','jyrac1' scope=spfile sid='jyrac1'; System altered. SQL> alter system set instance_groups='jyrac','jyrac2' scope=spfile sid='jyrac2'; SQL> alter system set parallel_instance_group='jyrac1' scope=spfile sid='jyrac1'; System altered. SQL> alter system set parallel_instance_group='jyrac2' scope=spfile sid='jyrac2'; System altered.
上面的设置意味着在任何节点上启动的并行只能在该节点上执行。
SQL> show parameter instance_group NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_groups string jyrac, jyrac1 parallel_instance_group string jyrac1 SQL>set autotrace on SQL> select /*+ parallel(t1,20) */ count(*) from t1; COUNT(*) ---------- 25962496 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4320 (1)| 00:00:52 | | | | | 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 | | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 45 recursive calls 0 db block gets 532872 consistent gets 355028 physical reads 2132 redo size 414 bytes sent via SQL*Net to client 400 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 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 124 PX Deq: Execution Msg 1 268566527 1 0 -1 1 126 PX Deq: Execution Msg 8409 268566527 1 0 11 1 127 PX Deq: Execution Msg 7775 268566527 1 0 0 1 128 PX Deq: Execution Msg 8462 268566527 1 0 0 1 129 PX Deq: Execute Reply 3151 200 1 0 0 1 134 PX Deq: Execution Msg 9208 268566527 1 0 0 1 136 PX Deq: Execution Msg 9136 268566527 1 0 20 1 140 PX Deq: Execution Msg 8348 268566527 1 0 0 1 153 PX Deq: Signal ACK 59131 10 3 0 0
从上面的信息可以看到确实在实例jyrac1上执行的并行查询并行子进程只在jyrac1实例上运行
SQL> show parameter instance_group NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_groups string jyrac, jyrac2 parallel_instance_group string jyrac2 SQL> select /*+ parallel(t1,20) */ count(*) from t1; COUNT(*) ---------- 25962496 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4320 (1)| 00:00:52 | | | | | 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 | | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 60 recursive calls 0 db block gets 533765 consistent gets 354821 physical reads 0 redo size 414 bytes sent via SQL*Net to client 400 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 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 ---------- ---------- ---------------------------------------------------------------- ---------- ---------- ---------- ---------- ---------- 2 120 PX Deq: Execution Msg 1 268632063 1 0 0 2 121 PX Deq: reap credit 13 0 0 0 -1 2 122 PX Deq: Execution Msg 1 268632063 1 0 0 2 129 PX Deq: Execution Msg 1 268632063 1 0 0 2 153 PX Deq: Join ACK 3664 268566529 8 0 0 2 131 PX Deq: Execution Msg 1 268632063 1 0 0 2 132 PX Deq: Execution Msg 1 268632063 1 0 0 2 133 PX Deq: Execution Msg 1 268632063 1 0 0 2 135 PX Deq: Execution Msg 1 268632063 1 0 0 2 139 PX Deq: Execution Msg 1 268632063 1 0 0 2 140 PX Deq: Execution Msg 1 268632063 1 0 0 2 141 PX Deq: Execution Msg 1 268632063 1 0 0 2 147 PX Deq: Execution Msg 1 268632063 1 0 0 2 119 PX Deq: Execution Msg 1 268632063 1 0 0 2 118 PX Deq: Execution Msg 1 268632063 1 0 0 2 130 PX Deq: Execution Msg 1 268632063 1 0 0
从上面的信息可以看到确实在实例jyrac2上执行的并行查询并行子进程只在jyrac2实例上运行
可以根据需要使用相同的实例组来完成不同的需求
myrac1.instance_groups=’jyrac’,’jyrac1′
myrac2.instance_groups=’jyrac’,’jyrac2′
myrac1.parallel_instance_group=’jyrac1’#节点1的并行执行只能在节点1上运行
myrac2.parallel_instance_group=’jyrac1’#节点2的并行执行只能在节点1上运行
myrac1.parallel_instance_group=’jyrac’#节点1的并行执行能在所有节点上运行
将实例jyrac1的parallel_instance_group设置为’jyrac1’来测试节点1的并行执行是否只能在节点1上运行
SQL> show parameter instance_group NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_groups string jyrac, jyrac1 parallel_instance_group string jyrac1 SQL>set autotrace on SQL> select /*+ parallel(t1,20) */ count(*) from t1; COUNT(*) ---------- 25962496 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4320 (1)| 00:00:52 | | | | | 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 | | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 45 recursive calls 0 db block gets 532872 consistent gets 355028 physical reads 2132 redo size 414 bytes sent via SQL*Net to client 400 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 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 124 PX Deq: Execution Msg 1 268566527 1 0 -1 1 126 PX Deq: Execution Msg 8409 268566527 1 0 11 1 127 PX Deq: Execution Msg 7775 268566527 1 0 0 1 128 PX Deq: Execution Msg 8462 268566527 1 0 0 1 129 PX Deq: Execute Reply 3151 200 1 0 0 1 134 PX Deq: Execution Msg 9208 268566527 1 0 0 1 136 PX Deq: Execution Msg 9136 268566527 1 0 20 1 140 PX Deq: Execution Msg 8348 268566527 1 0 0 1 153 PX Deq: Signal ACK 59131 10 3 0 0
从上面的信息可以看到确实在实例jyrac1上执行的并行查询并行子进程只在jyrac1实例上运行将实例jyrac2的parallel_instance_group设置为’jyrac1’来测试节点2的并行执行是否只能在节点1上运行
SQL> alter session set parallel_instance_group='jyrac1'; Session altered. SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- jyrac2 SQL> show parameter instance_group NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_groups string jyrac, jyrac2 parallel_instance_group string jyrac1 SQL> select /*+ parallel(t1,20) */ count(*) from t1; COUNT(*) ---------- 25962496 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4320 (1)| 00:00:52 | | | | | 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 | | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 21 recursive calls 0 db block gets 532751 consistent gets 354823 physical reads 0 redo size 414 bytes sent via SQL*Net to client 400 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 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 125 PX Deq: Execution Msg 8662 268632063 2 699436536 0 1 126 PX Deq: Execution Msg 9290 268632063 2 699434348 0 1 127 PX Deq: Execution Msg 8000 268632063 2 699433976 0 1 129 PX Deq: Execute Reply 7722 200 1 0 0 1 136 PX Deq: Execution Msg 1 268566527 1 0 -1 1 148 PX Deq: Execution Msg 8697 268632063 2 699439808 0 1 137 PX Deq: Execution Msg 8719 268632063 3 699432860 0 1 140 PX Deq: Execution Msg 8660 268632063 2 699433604 0
从上面的信息可以看到在实例jyrac2执行并行查询的并行子进程确实在jyrac1实例上运行的。
将实例jyrac1的parallel_instance_group设置为jyrac,来测试在jyrac1实例上执行并行查询的并行子进程将会在实例jyrac1,jyrac2上运行
SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- jyrac1 SQL> alter session set parallel_instance_group='jyrac'; Session altered. SQL> show parameter instance_group NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ instance_groups string jyrac, jyrac1 parallel_instance_group string jyrac SQL> select /*+ parallel(t1,20) */ count(*) from t1; COUNT(*) ---------- 25962496 Execution Plan ---------------------------------------------------------- Plan hash value: 3110199320 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 4320 (1)| 00:00:52 | | | | | 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 | | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWC | | | 6 | TABLE ACCESS FULL| T1 | 27M| 4320 (1)| 00:00:52 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 59 recursive calls 0 db block gets 533297 consistent gets 354823 physical reads 0 redo size 414 bytes sent via SQL*Net to client 400 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed 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 125 PX Deq: Execution Msg 4678 268566527 1 0 0 1 126 PX Deq: Execution Msg 4637 268566527 1 0 0 1 128 PX Deq: Execution Msg 4658 268566527 1 0 0 1 129 PX Deq: Execute Reply 10795 200 1 0 0 1 130 PX Deq: Execution Msg 1 268566527 1 0 -1 1 140 PX Deq: Execution Msg 4627 268566527 1 0 0 1 148 PX Deq: Execution Msg 4653 268566527 1 0 0 1 153 PX Deq: Execute Reply 59889 200 1 0 0 2 122 PX Deq: Execution Msg 3675 268566527 2 699422552 0 2 124 PX Deq: Execution Msg 3709 268566527 2 699424100 0 2 126 PX Deq: Execution Msg 4066 268566527 2 699426332 0 2 135 PX Deq: reap credit 13 0 0 0 -1 2 139 PX Deq: Execution Msg 4375 268566527 2 699420320 0 2 141 PX Deq: Execution Msg 4004 268566527 2 699423356 0
从上面的信息可以看到在jyrac1实例上执行并行查询的并行子进程确实在实例jyrac1,jyrac2上运行