设为首页 收藏本站
查看: 1782|回复: 0

[经验分享] Oracle开启并行的几种方法

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-20 09:57:46 | 显示全部楼层 |阅读模式
并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短。这里的额外硬件资源消耗是指对数据库服务器上多个CPU、内存、从个I/O通道,甚至是RAC环境下多个数据库节点的额外利用。
下面总结一下Oracle里开启并行的几种方法
1、更改目标表的并行度
有两种方法修改目标表的并行度
  • alter table table_name parallel;
  • alter table table_name parallel n;

其中方法1 是把指定表的并行度修改为默认值,方法2是把指定表的并行度修改为n;
查看表EMP当前的并行度为1
1
2
3
4
5
scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP                 1



想用默认的并行度去访问表EMP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
scott@TEST>alter table emp parallel;

Table altered.

scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP               DEFAULT

scott@TEST>set autotrace traceonly
scott@TEST>select * from emp;

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2873591275

--------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows | Bytes | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |    14 |  1218 |     2   (0)| 00:00:01 |  | |        |
|   1 |  PX COORDINATOR      |     |   |   |        |     |    | |        |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |       |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |         |
|   4 |     TABLE ACCESS FULL| EMP  |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |         |
--------------------------------------------------------------------------------------------------------------
.....



从上面的执行计划中可以看出,走的是对表EMP的全表扫描,PX...表示的就是走的并行
默认并行度的算法如下:

默认并行度=parallel_threads_per_cpu*cpu_count
如果想对表开启8个并行度则执行:alter table emp parallel 8;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP               DEFAULT

scott@TEST>alter table emp parallel 8;

Table altered.

scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP                 8



2、使用并行Hint
有如下一些并行Hint可以用来控制是否启用并行及指定并行度
1) /*+ parallel(table[,degree]) */  #用于指定并行度去访问指定表,如果没有指定并行度degree,则使用Oracle默认并行度
2) /*+ noparallel(table) */  #对指定表不使用并行访问
3) /*+ parallel_index(table[,index[,degree]]) */  #对指定的分区索引以指定的并行度去做并行范围扫描
4) /*+ no_parallel_index(table[,index]) */  #对指定的分区索不使用并行访问
5) /*+ pq_distribute(table,out,in) */ #对指定表以out/in所指定的方式来传递数据,这里out/in的值可以是HASH/NONE/BROADCAST/PARTITION中的任意一种如/*+ pq_distribute(table,none,partition) */
把表EMP修改回并行度为1
1
2
3
4
5
6
7
8
9
scott@TEST>alter table emp noparallel;

Table altered.

scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP                 1



使用并行Hint执行上之前的SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
scott@TEST>select /*+ parallel(emp) */* from emp;

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2873591275

--------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows | Bytes | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |    14 |  1218 |     2   (0)| 00:00:01 |  | |        |
|   1 |  PX COORDINATOR      |     |   |   |        |     |    | |        |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |       |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |         |
|   4 |     TABLE ACCESS FULL| EMP  |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |         |
--------------------------------------------------------------------------------------------------------------



从上面的执行计划中可以看出,走的是并行
3、使用alter session命令
使用alter session命令,可以在当前session中强制启用并行查询或并行DML。如果强制启用了并行查询或者并行DML,那就意味着从执行alter session命令强制开启并行的那个时间点开始,在这个session中随后执行的所有SQL都将以并行的方式执行,有如下四种方法在当前session中强制开启并行
1) alter session parallel query
在当前session中强制开启并行查询,没有指定并行度,Oracle使用默认并行度
2) alter session parallel query  parallel n
在当前session中强制开启并行查询,并且指定并行度为n
3) alter session parallel dml
在当前session中强制开启并行DML,没有指定并行度,Oracle使用默认并行度
4) alter session parallel dml  parallel n
在当前session中强制开启并行DML,并且指定并行度为n
表EMP并行度仍为1,在session中强制开启并行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
scott@TEST>select table_name,degree from user_tables where table_name='EMP';

TABLE_NAME             DEGREE
------------------------------ ----------
EMP                 1

scott@TEST>set autotrace traceonly
scott@TEST>alter session force parallel query;

Session altered.

scott@TEST>select * from emp;

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2873591275

--------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows | Bytes | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |    14 |  1218 |     2   (0)| 00:00:01 |  | |        |
|   1 |  PX COORDINATOR      |     |   |   |        |     |    | |        |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |       |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |         |
|   4 |     TABLE ACCESS FULL| EMP  |    14 |  1218 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |         |
--------------------------------------------------------------------------------------------------------------
......



从执行计划中可以看出走的是并行。
取消当前session并行使用如下语句alter session disable parallel query;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
scott@TEST>alter session disable parallel query;

Session altered.

scott@TEST>select * from emp;

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation     | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |  |    14 |  1218 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |  1218 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
......



4、11gR2的自动并行
Oracle在11gR2中引入了自动并行(Auto DOP),自动并行的开启受参数parallel_degree_policy的控制,其默认值为MANUAL,即自动并行在默认情况下并没有开启。如果通过更改PARALLEL_DEGREE_POLICY的值而开启了自动并行,那么后面执行的SQL的执行方式是串行还是并行,以及并行执行的并行度是多少等,就都是由Oracle自动来决定了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
scott@TEST>select table_name,degree from user_tables where table_name in ('EMP','EMP_TEMP');

TABLE_NAME                                         DEGREE
------------------------------------------------------------------------------------------ ------------------------------------------------------------
EMP                                                 1
EMP_TEMP                                                1

scott@TEST>alter session set parallel_degree_policy=AUTO;

Session altered.

scott@TEST>set autotrace traceonly
scott@TEST>select * from emp;

14 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation     | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |  |    14 |  1218 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |  1218 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
......
scott@TEST>select * from emp_temp;

1835008 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2661083444

--------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name   | Rows | Bytes | Cost (%CPU)| Time    |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |  1835K|    66M|  1683   (1)| 00:00:21 |   | |        |
|   1 |  PX COORDINATOR      |     |   |   |        |     |    | |        |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 |  1835K|    66M|  1683   (1)| 00:00:21 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |       |  1835K|    66M|  1683   (1)| 00:00:21 |  Q1,00 | PCWC |      |
|   4 |     TABLE ACCESS FULL| EMP_TEMP |  1835K|    66M|  1683   (1)| 00:00:21 |  Q1,00 | PCWP |         |
--------------------------------------------------------------------------------------------------------------
......



从上面的输出可以看出表EMP和EMP_TEMP的并行度都为1,但是两个表的数据量相关很大,EMP只有14条数据,EMP_TEMP有1835008条数据。在执行时Oracle选择的执行方式就有不同,EMP是串行执行,而EMP_TEMP为并行执行。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-352112-1-1.html 上篇帖子: NBU相关官方文档 下篇帖子: oracle数据库克隆 Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表