RAC架构之并行查询

就算采用了前面的《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:

The INSTANCE_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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值