就算采用了前面的《RAC架构之业务分割》来分割业务,并行查询还是会在所有实例上面来执行。
SQL> conn scott/tiger@rac_query
已连接。
SQL> create table t1 parallel 10 as select * from dba_objects;
表已创建。
SQL> select degree from user_tables where table_name = 'T1';
DEGREE
--------------------
10
SQL> select distinct sid from v$mystat;
SID
----------
643
SQL> set autotrace trace exp;
SQL> set linesize 200;
SQL> select count(*) from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3110199320
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 36 (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 | | 66957 | 36 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | TABLE ACCESS FULL| T1 | 66957 | 36 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
从执行计划中可以看出使用了并行查询。
SQL> set autotrace off;
SQL> select inst_id,sid,qcsid,qcinst_id,degree from gv$px_session where qcsid=643 order by sid;
INST_ID SID QCSID QCINST_ID DEGREE
---------- ---------- ---------- ---------- ----------
1 46 643 1 2
1 643 643
2 644 643 1 2
通过查看视图gv$px_session可以看到,此时oracle将并行分布到了2个实例上执行(INST_ID)。下面我们通过修改参数,来约束并行的执行节点。
SQL> conn /as sysdba
已连接。
SQL> show parameter instance_groups
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string
SQL> show parameter parallel_instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
parallel_instance_group string
SQL> alter system set instance_groups='rac_query' scope=spfile sid='orcl1';
系统已更改。
SQL> alter system set instance_groups='rac_load' scope=spfile sid='orcl2';
系统已更改。
SQL> alter system set parallel_instance_group='rac_query' scope=spfile sid='orcl1';
系统已更改。
SQL> alter system set parallel_instance_group='rac_load' scope=spfile sid='orcl2';
系统已更改。
重启数据库之后。
SQL> conn /as sysdba
已连接。
SQL> select inst_id,name,value,isdefault from gv$parameter where
2 name in('instance_groups','parallel_instance_group') order by 1,2;
INST_ID NAME VALUE ISDEFAULT
---------- ------------------------------ -------------------- ---------
1 instance_groups rac_query FALSE
1 parallel_instance_group rac_query FALSE
2 instance_groups rac_load FALSE
2 parallel_instance_group rac_load FALSE
下面我再次在实例1上面执行并行查询。
SQL> conn scott/tiger@rac_query
已连接。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
orcl1
SQL> select distinct sid from v$mystat;
SID
----------
632
SQL> set autotrace trace exp;
SQL> set linesize 200;
SQL> select count(*) from t1;
执行计划
----------------------------------------------------------
Plan hash value: 3110199320
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 36 (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 | | 66957 | 36 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | TABLE ACCESS FULL| T1 | 66957 | 36 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
SQL> set autotrace off;
SQL> select inst_id,sid,qcsid,qcinst_id,degree from gv$px_session where qcsid=632 order by sid;
INST_ID SID QCSID QCINST_ID DEGREE
---------- ---------- ---------- ---------- ----------
1 26 632 1 2
1 632 632
2 641 632 1 2
这里还是在两个实例上面执行了并行查询,可见11GR2,这样设置貌似无效。其中官方文档说已经过期:(
这里实验失败可能是我在本地虚拟机里面操作的,笔记本为单颗CPU,双核。)
Note:
TheINSTANCE_GROUPS
parameter is deprecated. It is retained for backward compatibility only.
在11.2以前,当用户发出并行查询,Oracle会将负载分配到所有的实例上,而在11.2中,Oracle提供了初始化参数,可以限制并行只运行在当前实例上。
parallel_force_local 顾名思义,该参数主要用于RAC环境,控制parallel server processes 是否能够跨节点,其属性为true、false,默认值为false。该参数为动态参数。参考:http://space.itpub.net/4227/viewspace-684317