rac 控制并行进程的执


1、此参数用于在rac环境下限制并行只在运行节点并行操作

PARALLEL_FORCE_LOCAL

PropertyDescription
Parameter typeBoolean
Default valuefalse
ModifiableALTER SESSIONALTER SYSTEM
Range of valuestrue | false
BasicNo

PARALLEL_FORCE_LOCAL controls parallel execution in an Oracle RAC environment. By default, the parallel server processes selected to execute a SQL statement can operate on any or all Oracle RAC nodes in the cluster. By setting PARALLEL_FORCE_LOCAL to true, the parallel server processes are restricted so that they can only operate on the same Oracle RAC node where the query coordinator resides (the node on which the SQL statement was executed on).


在rac环境中,如果使用parallel创建目标对象,那么并行创建一般会在主节点运行。

但是使用命令:

alter session set PARALLEL_FORCE_LOCAL=true

在并行创建目标对象,只会在执行命令的节点上并行创建目标对象

在节点二上执行并行:
             select /*+full(t1) full(t2) parallel(t1,4)*/* from scott.t1,scott.t1 t2 where t1.empno=t2.empno;
               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 username='SCOTT'  and MODULE='SQL*Plus' and status='ACTIVE'
 ) GROUP BY INST_ID; 
                                   INST_ID   COUNT(1)
---------- ----------
2    5


2、parallel_instance_group和instance_groups控制并行进程在rac实例跨节点执行

SQL> show parameter instance_group

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_groups 		     string
parallel_instance_group 	     string



设置并行组:
node1:
SQL> alter system set  instance_groups='p','p1' scope=spfile sid='test1';
node2:

SQL> alter system set  instance_groups='p','p2' scope=spfile sid='test2';

重启rac:

SQL> show parameter instance_group
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_groups 		     string	 p, p2
parallel_instance_group 	     string

SQL> show parameter instance_group

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_groups 		     string	 p, p1
parallel_instance_group 	     string


如果在没有设置parallel_isntance_group的情况下,rac会根据负载情况在两个节点分配并行进程数目:

在node2 ,scott上执行并行:

 select /*+full(t1) full(t2) parallel(t1,4)*/* from scott.t1,scott.t1 t2 where t1.empno=t2.empno;
然后查看:
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 username='SCOTT'  and MODULE='SQL*Plus' and status='ACTIVE'
  ) GROUP BY INST_ID; 
  INST_ID   COUNT(1)
---------- ----------
	 1	    4
	 2	    5


设置了parallel_instance_group 后,那么并行进程只会在含有parallel_instance_group 指定的组上的实例上分配并行进程



设置
SQL> alter session set parallel_instance_group='p2';

SQL> show parameter instance_group

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_groups 		     string	 p, p2
parallel_instance_group 	     string	 p2

当node2 设置了parallel_instance_group='p2'后,那么并行进程只会在instance_groups中有p2组的实例上开启并行进程,含有p2的instance_group只有在node2上有,
那么并行进程会在node2上有5个进程,一个并行协调进程,4个并行进程

在node2 ,scott用户下执行下列并行:
 select /*+full(t1) full(t2) parallel(t1,4)*/* from scott.t1,scott.t1 t2 where t1.empno=t2.empno;



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 username='SCOTT'  and MODULE='SQL*Plus' and status='ACTIVE'
  ) GROUP BY INST_ID; 

 INST_ID   COUNT(1)
---------- ----------
	 2	    7

设置
alter session set  parallel_instance_group='p1'

SQL> show parameter instance_group

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
instance_groups 		     string	 p, p2
parallel_instance_group 	     string	 p1


当node2 设置了parallel_instance_group='p1'后,那么并行进程只会在instance_groups中有p1组的实例上开启并行进程,含有p1的instance_group只有在node1上有,
那么并行进程会在node1上有4个并行进程,node2上有一个并行协调进程.

在node2 ,scott用户下执行下列并行:
 select /*+full(t1) full(t2) parallel(t1,4)*/* from scott.t1,scott.t1 t2 where t1.empno=t2.empno;


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 username='SCOTT'  and MODULE='SQL*Plus' and status='ACTIVE'
  ) GROUP BY INST_ID; 


  INST_ID   COUNT(1)
---------- ----------
	 1	    8
	 2	    1


出现这样的结果,节点一是8,那是因为有并行子进程存在


总结
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' --不会启用并行



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值