前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle 之 控制Oracle RAC 进行并行运算

Oracle 之 控制Oracle RAC 进行并行运算

作者头像
星哥玩云
发布2022-08-16 21:09:12
3710
发布2022-08-16 21:09:12
举报
文章被收录于专栏:开源部署

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

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

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

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

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

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;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档