oracle 之 控制oracle RAC 进行并行运算
RAC的一大优点就是可以跨节点进行并行计算,那么如何控制并行运算?这就是这篇文章要讨论的内容。
10 g 中:
合理设置跨节点并行,需要先设置一些参数:
instance_groups:这个参数主要是设置该节点实例是否属于某一个实例组。每个节点可以设置多个不同的实例组名,实例组名用逗号隔开。
parallel_instance_group设置的值为instance_groups里面设置的值,表明这个节点上面进行的并行操作可以跨越哪些实例组。
alter system set instance_groups='dw','dw1','dw123','dw124','dw134' scope=spfile sid='dwrac1';
alter system set instance_groups='dw','dw2','dw123','dw124','dw234' scope=spfile sid='dwrac2';
alter system set instance_groups='dw','dw3','dw123','dw134','dw234' scope=spfile sid='dwrac3';
alter system set instance_groups='dw','dw4','dw124','dw134','dw234' scope=spfile sid='dwrac4';
以上参数分别为4个节点定义了5个instance group,有的group包含多个节点,有的group只包含一个节点。
一、跨所有节点执行
分两种情况进行测试:instance_groups包含所有节点和instance_groups只包含一个节点。
1. instance_groups包含所有节点
1). 节点2参数设置情况
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
只定义了instance_groups,不设置parallel_instance_group。
前面我们设置过,dw这个instance_group包含了所有的节点。
2). 在节点2发出查询
admin@dwrac2> select /*+ parallel(a,128) */count(1) from testuser.big_table a;
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 32
2 33
4 32
3 32
可以看到,并行会话(parallel slaves)平均分配到4个节点上。节点2多一个进程是因为它是并行查询的发起者,额外的会话是发起会话,也就是并行查询协调器(parallel query coordinator),其余的是并行从属进程。
之所有能分配到4个节点上,是因为4个节点都属于dw这个instance group,且都没有设定parallel_instance_group。
2. instance_groups只包含一个节点
1). 修改参数
admin@dwrac2> alter system set instance_groups='dw2' scope=spfile sid='dwrac2';
重启
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw2
parallel_instance_group string
不设置parallel_instance_group,且instance_group=dw2只包含节点2.
2). 发出并行查询
admin@dwrac2> select /*+ parallel(a,128) */count(1) from testuser.big_table a;
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 32
2 33
4 32
3 32
可以看到,即使是instance_groups='dw2'只在节点2出现,但是如果不设置parallel_instance_group,并行仍然可以跨越所有节点。
二、跨部分节点执行
这部分分两种测试:发出命令的节点属于parallel_instance_group的一员以及发出命令的节点不属于parallel_instance_group
1. 发出命令的节点属于parallel_instance_group的一员
1). 在节点2修改参数
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
admin@dwrac2> alter session set parallel_instance_group='dw2';
Session altered.
--这个设置的会强制并行操作只会属于dw2这个instance group的节点中执行。
--注意:parallel_instance_group是大小写区分的,如果用alter session set parallel_instance_group=dw2,则不会起任何并行进程,因为不加单引号的话,实际上载后台dw2会被转换成大写的DW2,不属于任何一个instance group。
2). 在节点2发出同样的查询
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
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)
---------- ----------
2 129
可以看到,因为只有节点2属于dw2这个instance group,所有并行会话都分布在节点2上。
2. 发出命令的节点不属于parallel_instance_group
1) 在节点2修改参数
admin@dwrac2> show parameter instance_group
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_groups string dw, dw2, dw123, dw124, dw234
parallel_instance_group string
admin@dwrac2> alter session set parallel_instance_group='dw1';
Session altered.
根据我们之前的设置,只有节点1属于dw1这个instance group。
2) 在节点2发出查询
admin@dwrac2> select /*+ parallel(a,128) */ count(1) from testuser.big_table a;
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' --不会启用并行
转:http://www.cnblogs.com/ylqmf/archive/2012/03/16/2400126.html
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;
oracle 之 控制oracle RAC 进行并行运算的更多相关文章
- Oracle HA 之 oracle 11.2 rac库配置active dataguard
目录 configing active dataguard for 11.2 rac. 1 一.建组.建用户.配置环境变量.内核参数等... 1 二.配置共享磁盘... 3 1)创建4块共享磁盘并fd ...
- 转载:【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- 转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- 转载:【Oracle 集群】RAC知识图文详细教程(二)--Oracle 集群概念及原理
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- Oracle的控制文件
一.控制文件 oracle的控制文件是极其重要的文件,它是一个较小的二进制文件. 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等 在参数文件中描述其位置, ...
- oracle 双机热备,oracle dataguard 和oracle rac的区别和联系(转)
Data Guard 是Oracle的远程复制技术,它有物理和逻辑之分,但是总的来说,它需要在异地有一套独立的系统,这是两套硬件配置可以不同的系统,但是这两套系统的软件结构保持一致,包括软件的版本,目 ...
- 如何利用Oracle VM Templates 在几分钟内部署Oracle Real Application Clusters (RAC)
本文未经授权,禁止一切形式的转载.如果对本文有任何疑问可以通过以下方式和我交流: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiang ...
- solaris下安装oracle 11g与11g rac
1.To Find Swap, RAM, and OS Version 对于 Solaris 操作系统,查看 Swap, RAM, and OS Version 的方法: swap -l /usr/s ...
- Oracle集群(RAC)时间同步(ntp和CTSS)
Oracle集群(RAC)时间同步(ntp和CTSS) http://blog.itpub.net/26736162/viewspace-2157130/ crsctl stat res -t -in ...
随机推荐
- java 不可不知的数据库知识-----事物
每一个java开发对数据库都不会陌生,提到数据库,那么就一定要了解的一个知识点------事物,下面就对事物简单记录一下相关知识点. 最初接触事物的时候其实是从JDBC事物开始的,JDBC比较基础,这 ...
- Day10 - Python异步IO、Pymysql、paramiko、
IO多路复用: 参考博客:http://www.cnblogs.com/wupeiqi/p/6536518.html socket客户端(爬虫): http://www.cnblogs.com/w ...
- iptables详解(8):iptables扩展模块之state扩展
当我们通过http的url访问某个网站的网页时,客户端向服务端的80端口发起请求,服务端再通过80端口响应我们的请求,于是,作为客户端,我们似乎应该理所应当的放行80端口,以便服务端回应我们的报文可以 ...
- Sql server日期函数操作
1.获取前一小时内的数据:DATEADD(HOUR,-1,GETDATE()),将"HOUR"替换成DAY,Month,YEAR就是前一天,前一月,前一年 2.获取日期部分,格式为 ...
- 验证email是否合法
https://buluo.qq.com/p/detail.html?bid=339910&pid=6675390-1514450689&from=grp_sub_obj 场景1:验证 ...
- 各排序算法的Java实现及简单分析
一,直接插入排序 //直接插入排序的算法时间复杂度分析: //如果输入为正序,则每次比较一次就可以找到元素最终位置,复杂度为O(n) //如果输入为反序,则每次要比较i个元素,复杂度为O(n2) // ...
- LeetCode OJ:H-Index(H指数)
Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...
- jQuery实现点击式选项卡
参考:jQuery权威指南jQuery初步jQuery选择器jQuery操作domjQuery操作dom事件jQuery插件jQuery操作AjaxjQuery动画与特效jQuery实现导航栏jQue ...
- DLL声明导出函数的两种方式
DLL中导出函数的声明有两种方式:一种为在函数声明中加上__declspec(dllexport):另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出.属 ...
- va_start、va_arg、va_end、va_copy 可变参函数
1.应用与原理 在C语言中,有时我们无法给出一个函数参数的列表,比如: int printf(const char *format, ...); int fprintf(FILE *s ...