oracle中如何发并行,oracle 开并行

如何配置Oracle并行处理

Oracle试图自动化系统配置来使并行操作的性能最大化。然而,仍然有许多手工调整的空间,我们可以调整数据库,优化SQL并行性能。

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了西乡塘免费建站欢迎大家使用!

判断并行度

合适的并行度DOP对于良好的并行性能很关键。Oracle会按如下方式设定DOP:

1、如果指定或请求了并行执行,但是没有指定DOP,默认DOP会设置为该系统上CPU内核数量的两倍。对于RAC系统,DOP值会是整个集群内核数量的两倍。默认值是由配置参数“PARALLEL_ THREADS_PER_CPU”控制的。

2、对于Oracle 11g R2之后的版本,如果“ PARALLEL_DEGREE_POLICY”被设置为“AUTO”,Oracle将根据被执行的运行性质和涉及对象的大小自动调整DOP值。

3、如果“PARALLEL_ADAPTIVE_MULTI_USER”被设置为“TRUE”,Oracle将基于该系统的整个负载调整DOP。当系统承受更重的负载时,DOP值将会减少。

4、在Oracle 11g或者更高版本中,如果“PARALLEL_IO_CAP ”被设置为TRUE,Oracle将把DOP限制为IO子系统可以支持的值。这些IO子系统限制可以通过“DBMS_RESOURCE_ MANAGER.CALIBRATE_IO”存储过程计算。

5、DOP可以被指定到表或者索引一级,可以通过在“CREATE TABLE”,“CREATE INDEX”,“ALTER TABLE”或者“ALTER INDEX”中使用“PARALLEL ”从句来实现。

6、“PARALLEL ”关键字可以被用来指定某个查询中指定表的DOP。

7、不管任何其它设置,DOP不能超过“PARALLEL_MAX_SERVERS”可以支持的数量。对于大部分SQL语句,服务器数量需要是请求DOP的两倍。

正如我们可以看到的,超过优化点增减DOP会导致进一步性能提升的失败。然而,超过最佳优化限制强行增加DOP值会对整个系统性能带来重大的负面影响。尽管被并行化的SQL可能不会随着DOP的增加而降低,但是该系统的负载会持续增加,而且会引起其它并发运行的SQL要遭受响应时间降低的影响。

当我们达到最优DOP点时(该系统中的值大约是8),查询时间的减少变的平缓了。然而,其它会话在等待CPU可用上花费的时间会持续增长。其它等待访问CPU的会话将需要继续等待,这会导致响应时间变慢。

oracle 怎样使用并行查询

直接用hint即可。例如:

select /*+parallel(o2)*/* from t_objects o

其中o为要开启并行的表的别名,2为并行度。

不过不一定会提升效率,一般查询中使用parallel的情景如下:

需要大量的 表的扫描、连接或者分区索引扫描。

聚合操作(计数)。

oracle 并行模式(parallel)

一般表数据量比较大(超过100万)时,可以使用parallel强制启动并行度来提升查询速度

用法:/*+parallel(table_short_name,cash_number)*/

可以加到insert、delete、update、select的后面来使用

比如:select /*+paralle(t,32)*/ from table t; table_short_name使用别名,Parallel后面的数字,越大,执行效率越高,一般用8,10,12,16,32。不过,数值越大,占用的资源也会相对增大。如果在查询where后的条件有加索引查询效率会大大提高。

oracle并行建索引

我们创建索引的时候,可以启用并行,来加快速度,例如:

访问有并行度的索引时,CBO可能可能会考虑并行执行,这可能会引发一些问题,

如在服务器资源紧张的时候用并行会引起更加严重的争用。

当使用并行后,需要把并行度改回来,例如:

oracle存储过程如何并行?

A1 A2 A3也是存储过程吗? job其实上也只是分别调用这几个过程来执行,而不是靠执行一个A就可以让所有A1 2 3 4 并行执行的。 如果A1 2 3 4都是需要参数的话,那么你也只有用A分开给每一个都传递参数,否则的话也是不能并行执行的。 例如:

declare n number

begin

dbms_job.submit('a1;a2;a3;a4',sysdate,'trunc(sysdate+1)');

commit;

end;

/

这样会让a1 2 3 4分别同时执行,你可以做一个改动就是让a给a*传递参数的动作 直接加入到a 1 2 3 4的过程当中才可以。

如何控制oracle RAC 进行并行运算

RAC的一大优点就是可以跨节点进行并行计算,那么如何控制并行运算?这就是这篇文章要讨论的内容。

合理设置跨节点并行,需要先设置一些参数:

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


网站标题:oracle中如何发并行,oracle 开并行
当前路径:http://scyanting.com/article/hchsci.html