并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短。这里的额外硬件资源消耗是指对数据库服务器上多个CPU、内存、从个I/O通道,甚至是RAC环境下多个数据库节点的额外利用。

下面总结一下Oracle里开启并行的几种方法

1、更改目标表的并行度

有两种方法修改目标表的并行度

alter table table_name parallel;

alter table table_name parallel n;

其中方法1 是把指定表的并行度修改为默认值,方法2是把指定表的并行度修改为n;

查看表EMP当前的并行度为1

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

TABLE_NAME       DEGREE

------------------------------ ----------

EMP1

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

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;

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

------------------------------ ----------

EMP8

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

scott@TEST>alter table emp noparallel;

Table altered.

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

TABLE_NAME       DEGREE

------------------------------ ----------

EMP1

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

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中强制开启并行:

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

TABLE_NAME       DEGREE

------------------------------ ----------

EMP1

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;

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自动来决定了。

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为并行执行。

参考《基于Oracle的SQL优化》

官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2013.htm#i2231814

oracle plsql开启并行,Oracle开启并行的几种方法相关推荐

  1. 如何让oracle用户不过期,Oracle用户密码设为不过期的两种方法

    1.在sql Plus下,以DBA身份登陆 用户名/密码@服务器SID as sysdba 方法一:(注意必须用双引号把后面的引上) C:/Documents and Settings/ssy> ...

  2. 如何时重启打印机服务bat命令,打印机重启服务脚本 Win7打印机服务怎么开启 Win7开启打印机服务的设置的两种方法

    重启打印机服务bat命令 @echo off echo 停止打印服务 net stop Spooler echo 重新启动打印服务 net start Spooler echo 完成!!!! paus ...

  3. 【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?

    ♣题目部分 在Oracle中,获取执行计划有哪几种方法? ♣答案部分 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Pl ...

  4. 怎么启用计算机服务设置,Win7打印机服务怎么开启 Win7开启打印机服务的设置的两种方法...

    如果我们连接了打印机,但是电脑中的Print Spooler打印机服务没有开启的话,就会出现打印机无法打印的情况.那么Win7打印机服务怎么开启?下面装机之家分享一下Win7开启打印机服务的设置的两种 ...

  5. oracle中pdb,Oracle12c数据库创建pdb的3种方法

    Oracle12c数据库创建pdb的3种方法 1.根据seed创建pdb CREATE PLUGGABLE DATABASE salespdb ADMIN USER salesadm IDENTIFI ...

  6. window10电脑远程没有oracle,win10 不安装oracle plsql连接远程oracle

    折腾了好几个小时:could not initialize XXXXoci.dll ,其实是plsql的问题,plsql重装之后就OK了:之前一直在重新下载instantclient一直在重新配置,浪 ...

  7. oracle plsql递归查询语句,oracle with 语句实现递归查询

    Oracle with 语句可以实现如同connect by 语句一样的序列: connect by用法 使用rownum实现1到10的序列.select rownum from dual conne ...

  8. oracle plsql异常,【Oracle篇】异常处理和PLSQL

    一.所有的PL/SQL异常都具有以下几个基本特征: 错误类型:表示了错误是ORA错误还是PLS错误 错误代号:一串表示错误代号的数字 错误文本:错误消息文本,包括错误代号 二.PL/SQL会产生两种类 ...

  9. Oracle导出表(即DMP文件)的两种方法

    方法一:利用PL/SQL Developer工具导出: 菜单栏---->Tools---->Export Tables,如下图,设置相关参数即可: 方法二:利用cmd的操作命令导出,详情如 ...

  10. 开启电脑的管理员权限的两种方法

    在使用电脑进行一些软件的下载.安装和配置的过程中,往往会因为权限不足而导致各种各样的妖魔鬼怪出现,下面介绍一下如何开启本电脑中的管理员权限. [方法一] 1.鼠标点击右键"我的电脑" ...

最新文章

  1. 某程序员揭秘“开水团”大厂真实福利:工位拥挤,没有食堂!公司防员工跟防贼一样,特别是纸巾和插排都粘到桌子上!...
  2. depot用例视图建模
  3. Python工程师学习笔记
  4. 商业银行为什么大量组织高净值小规模活动?
  5. 【Java】BigDecimal
  6. shell分析日志常用指令合集
  7. SP2010开发和VS2010专家食谱--第四章节—列表定义和内容类型(7)--创建列表定义...
  8. VC与Matlab混合编程的快速实现(3-1)
  9. 前端代码优化的基本原则
  10. MySQL的replace方法
  11. smartforms 双面打印 设置
  12. 【设计模式】-工厂模式->抽象工法模式(源码与类图解析)
  13. 用计算机和手算标准差不一致,计量师基础知识教案二第三章.ppt
  14. android关机铃声代码,android系统添加关机铃声
  15. 局域网sip服务器搭建:opensips
  16. IntelliJ Idea快捷键(排版清晰!!持续更新!!非常详细)
  17. HTTP和AJAX重点知识
  18. 阿里巴巴实习生负一天
  19. 图片裁剪工具之cropper.js
  20. 计算机硬件加网络俱乐部,[硬件维护]免费为大家提供电脑硬件方面的咨询,24小时在线服务!...

热门文章

  1. Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
  2. SYNCHRO 4D可视化调度学习教程 SYNCHRO 4D: Visual Scheduling
  3. 如何对 Rocksdb以及类似存储引擎社区 提出 有效的性能问题?
  4. 二分法:search insert position 插入位置
  5. VC++关于UNICODE版本的开发
  6. ES6中export及export default的区别
  7. 2016-2017-2软件工程课程总结
  8. div模拟textarea文本域轻松实现高度自适应——张鑫旭
  9. 报表性能优化方案之报表服务器优化基础讲解
  10. javabean和EJB的区别