3) 新开一个会话查询并行进程信息
SQL> 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 s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 128
2 1
可以看到,除了并行查询协调器(也就是发出查询命令的会话)外,所有并行进程都运行在节点1上。
这也说明了,即使发出并行查询指令的节点不属于parallel_instance_group,但它仍然可以调用属于parallel_instance_group的节点资源。
admin@dwrac2> alter session set parallel_instance_group='dw134';
Session altered.
Elapsed: 00:00:00.00
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
SQL> 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 s.username='ADMIN' and module like 'SQL*%') GROUP BY INST_ID;
INST_ID COUNT(1)
---------- ----------
1 42
2 1
4 42
3 44
总结一下:
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' --不会启用并行
11 g 中:
11g 数据库中,并行会话默认使用的是 shared pool 用于并行执行时的消息缓冲区,
并行过多时容易造成 shared pool 不足,使数据库报 ORA-4031 错误。将这个参数设置为
true,使并行会话改为使用 large pool。
1、-- 调整 Px 操作使用 shared pool
alter system set "_px_use_large_pool"=true sid ='*' scope=spfile;
2、-- RAC 参数调整 parallel_force_local
该 11g 的新增参数,用于将并行的 slave 进程限制在发起并行 SQL 的会话所在的
节点,即避免跨节点并行产生大量的节点间数据交换和引起性能问题。该参数取代 11g
之前的 instance_groups 和 parallel_instance_group 两个参数。
alter system set parallel_force_local=true sid='*' scope=spfile;