Oracle Study之案例--Oracle Parallel Execution(并行执行)

Oracle Study之案例--Oracle Parallel Execution(并行执行) 

并行(Parallel)和OLAP系统 
      并行的实现机制是:首先,Oracle会创建一个进程用于协调并行服务进程之间的信息传递,这个协调进程将需要操作的数据集(比如表的数据块)分割成很多部分,称为并行处理单元,然后并行协调进程给每个并行进程分配一个数据单元。比如有四个并行服务进程,他们就会同时处理各自分配的单元,当一个并行服务进程处理完毕后,协调进程就会给它们分配另外的单元,如此反复,直到表上的数据都处理完毕,最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果,返回给用户。
     并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,Oracle会启动几个并行服务进程同时处理这些小数据集,最后将这些结果汇总,作为最终的处理结果返回给用户。 
     这种数据并行处理方式在OLAP系统中非常有用,OLAP系统的表通常来说都是非常大,如果系统的CPU比较多,让所有的CPU共同来处理这些数据,效果就会比串行执行要高得多。 
     然而对于OLTP系统,通常来讲,并行并不合适,原因是OLTP系统上几乎在所有的SQL操作中,数据访问路径基本上以索引访问为主,并且返回结果集非常小,这样的SQL操作的处理速度一般非常快,不需要启用并行。 
并行处理的机制 
     当Oracle数据库启动的时候,实例会根据初始化参数 PARALLEL_MIN_SERVERS=n的值来预先分配n个并行服务进程,当一条SQL被CBO判断为需要并行执行时发出SQL的会话进程变成并行协助进程,它按照并行执行度的值来分配进程服务器进程。
     首先协调进程会使用ORACLE启动时根据参数: parallel_min_servers=n的值启动相应的并行服务进程,如果启动的并行服务器进程数不足以满足并行度要求的并行服务进程数,则并行协调进程将额外启动并行服务进程以提供更多的并行服务进程来满足执行的需求。然后并行协调进程将要处理的对象划分成小数据片,分给并行服务进程处理;并行服务进程处理完毕后将结果发送给并行协调进程,然后由并行协调进程将处理结果汇总并发送给用户。 
     刚才讲述的是一个并行处理的基本流程。实际上,在一个并行执行的过程中,还存在着并行服务进程之间的通信问题。 
    在一个并行服务进程需要做两件事情的时候,它会再启用一个进程来配合当前的进程完成一个工作,比如这样的一条SQL语句: 
Select * from employees order by last_name; 
     假设employees表中last_name列上没有索引,并且并行度为4,此时并行协调进程会分配4个并行服务进程对表employees进行全表扫描操作,因为需要对结果集进行排序,所以并行协调进程会额外启用4个并行服务进程,用于处理4个进程传送过来的数据,这新启用的用户处理传递过来数据的进程称为父进程,用户传出数据(最初的4个并行服务进程)称为子进程,这样整个并行处理过程就启用了8个并行服务进程。 其中每个单独的并行服务进程的行为叫作并行的内部操作,而并行服务进程之间的数据交流叫做并行的交互操作。 

wKiom1SIACKibndzAAHSPqwGhwA502.jpg     这也是有时我们发现并行服务进程数量是并行度的2倍,就是因为启动了并行服务父进程操作的缘故

案例分析:

查看并行服务执行计划

16:13:07 SCOTT@ test1 >create table emp2 as select * from emp;
Table created.

16:13:26 SCOTT@ test1 >alter table emp2 parallel 2;
Table altered.

16:13:37 SCOTT@ test1 >set autotrace trace
16:14:20 SCOTT@ test1 >select sum(sal) from emp2 group by deptno

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 3939201228

------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |          |    14 |   364 |     3  (34)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR          |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)    | :TQ10001 |    14 |   364 |     3  (34)| 00:00:01 |  Q1,01 | P->S | QC (RAND)  |
|   3 |    HASH GROUP BY         |          |    14 |   364 |     3  (34)| 00:00:01 |  Q1,01 | PCWP |            |
|   4 |     PX RECEIVE           |          |    14 |   364 |     3  (34)| 00:00:01 |  Q1,01 | PCWP |            |
|   5 |      PX SEND HASH        | :TQ10000 |    14 |   364 |     3  (34)| 00:00:01 |  Q1,00 | P->P | HASH       |
|   6 |       HASH GROUP BY      |          |    14 |   364 |     3  (34)| 00:00:01 |  Q1,00 | PCWP |            |
|   7 |        PX BLOCK ITERATOR |          |    14 |   364 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   8 |         TABLE ACCESS FULL| EMP2     |    14 |   364 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
------------------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
         12  recursive calls
          0  db block gets
          6  consistent gets
          0  physical reads
          0  redo size
        471  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          3  rows processed

通过执行计划,我们来看一下它的执行步骤: 
1、并行服务进程对EMP2表进行全表扫描。 
2、并行服务进程以ITERATOR(迭代)方式访问数据块,也就是并行协调进程分给每个并行服务进程一个数据片,在这个数据片上,并行服务进程顺序地访问每个数据块(Iterator),所有的并行服务进程将扫描的数据块传给另一组并行服务进程(父进程)用于做Hash Group操作。 
3、并行服务父进程对子进程传递过来的数据做Hash Group操作。 
4、并行服务进程(子进程)将处理完的数据发送出去。 
5、并行服务进程(父进程)接收到处理过的数据。 
6、合并处理过的数据,按照随机的顺序发给并行协调进程(QC:Query Conordinator)。 
7、并行协调进程将处理结果发给用户。 
当使用了并行执行,SQL的执行计划中就会多出一列:in-out。 该列帮助我们理解数据流的执行方法。 它的一些值的含义如下: 
Parallel to Serial(P->S): 表示一个并行操作发送数据给一个串行操作
Parallel to Parallel(P->P):表示一个并行操作向另一个并行操作发送数据
Parallel Combined with parent(PCWP): 同一个从属进程执行的并行操作,同时父操作也是并行的。
Parallel Combined with Child(PCWC): 同一个从属进程执行的并行操作,子操作也是并行的。 
Serial to Parallel(S->P): 一个串行操作发送数据给并行操作,如果select部分是串行操作,就会出现这个情况。 

并行执行等待事件 
在做并行执行方面的性能优化的时候,可能会遇到如下等待事件 
PX Deq Credit: send blkd 
这是一个有并行环境的数据库中,从statspack 或者AWR中经常可以看到的等待事件。 在Oracle 9i 里面, 这个等待时间被列入空闲等待。 
一般来说空闲等待可以忽略它,但是实际上空闲等待也是需要关注的,因

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
葡萄城的一款尚在研发中的产品,对外名称暂定为X项目。其中使用了已经上市的wijmo中 SpreadJS 产品,另外,在研发过程中整理了一些研发总结分享给大家。如本篇的在页面切换的过程中优化方案,欢迎大家跟帖交流。 前言 AngularJs被用来开发单页面应用程序(SPA),利用AJAX调用配合页面的局部刷新,可以减少页面跳转,从而获得更好的用户体验。Angular的ngView及其对应的强大路由机制,是实现SPA应用的核心模块。本文所说的页面切换指的就是这个路由机制,即根据不同的url展示不同的视图。 有
Cikers密码库使用说明 History 1.1.0, 2014-11-28 Friday Shane Loo Li 初版 1.1.1, 2014-11-30 Sunday Shane Loo Li 增加了Mac版的国内下载地址,增加了编辑备注的意义,增加了对backup组的操作建议 1使用密码库的背景 1.1一个真实的场景 自动化部署脚本还需要3天,今天刚有同事交付过来12台新装的服务器,加上原来的17台服务器,都需要部署昨天交待上线的程序。这是工作,于是他翻出密码记录文件,是一个.txt,开始看着I

人性化的Ruby计数取值 - 2015-04-24 06:04:08

Ruby由于吸收了Perl的正则表达式和Python的可读性,所以其中的计数取值方法,是非常人性化和灵活的,这里可以举例来说明下: 一、打印7次“hello,world”,如下: 7.times{puts"hello,world"}#在这里,puts的作用等同于print+"\n" 二、依次打印1..9,在ruby中的方法就更多了,这里用比较简单的方式来实现,如下: (1..9).each{|i|printi,""} 三、打印1..9中比7要小的数值,如下: 1.upto(9){|i|printi,""i

mysql存储引擎优化参数 - 2015-04-23 20:04:31

MySQL 配置参数优化 本文来自道森学习笔记,版权归 http://wubx.net/所有 MyISAM 存储引擎优化 涉及参数如下: Key_buffery_size Concurrent_insert = 2 | WAAYS Bulk_insert_buffer_size=8M Myisam_recover_options=FORCE Myisam_recover_threads=1 Myisam_sort_buffer_size=1G 参数解释: key_buffery_size 主要用于存放my
最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web 的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站。但真正大规模的使用 js 这还是第一次。我也是初生牛犊不怕虎,这次服务器居然抛弃 C++ 和 lua 的正统搭配,而尝试用 nodejs 来写游戏服务器,折腾的自己要死要活的我也是醉了。 在给我们项目组的其他程序介绍 js 的时候,我准备了很多的内容,但看起来效果不大,果然光讲还是不行的,必须动手。前几天有人

阿里云ECS的一次简单试用 - 2015-04-23 10:04:26

这是我第一次申请使用云主机,感觉已经落后了一个时代。因为可以试用半年,看起来比Azure的一元钱用一个月和腾讯的15天免费便宜不少,所以图便宜申请了阿里云ECS。Elastic的意思我想大概是强调伸缩性吧,资源紧张的时候直接花钱多买些,回头再研究具体要如何优化。 首先注册有些小麻烦,需要支付宝实名认证,为此我还跑了次银行,开通了快捷支付。但是申请就很快,从提交申请到主机创建快的吓人。比腾讯那个15天试用好多了,那个每天就100台,我连申请都递交不上去。 主机创建后是这个样子。 境外的数据中心只有美国,这比
夜已深然未央,准备接着讲述有关Netfilter的故事,行文有点松散,由于未打草稿,有点随意识而流,一气呵成不知是自夸还是自嘲,权当小时候写的日记吧,自幼喜欢每天写日记,中学时更是以退士为名折腾了几箱子抄本,前几年由于喝酒就改为周记了,现在意识到了生命短暂,时间甚是不够用,不能在迷迷糊糊中得过且过,就准备把自己知道的关于Linux网络的东西一点一滴记录下来,本来想继续行文于纸上,然而发现在个人电脑智能手机时代,很多字早就不会写了...上回没有说完关于iptables的故事,本文继续... 一.nftabl
2012年平安夜,我离开工作了近十年的通讯行业投身互联网行业,入职了当时阿里巴巴旗下的淘宝浏览器开发团队。过去的两年,这个团队完成了从淘宝浏览器过渡到UC浏览器电脑版开发团队的巨变。之所以说是巨变,是因为整个开发团队的工作方法、工作质量和精神风貌在过去的两年发生了翻天覆地的变化。在这个过程中,我作为“领头羊”引领着开发团队向前发展,并在最近有机会成为了带领包含开发和测试在内的整个技术团队继续向前发展的负责人。 个体在两年内取得巨大变化相对容易,而对于一个团队来说挑战就大了很多,因为其中包含了技术和管理两方
一般实现session共享,最常用的一种方法就是通过memcached-session-manager。下边我就说一下,怎么通过memcached-session-manager实现session共享。 首先建一个放软件的目录,进入此目录。 [root@node1~]#mkdir-p/taokey/tools[root@node1~]#cd/taokey/tools/ 2.把下载好的apache-tomcat-7.0.57.tar.gz和jdk-7u71-linux-x64.gz软件包上传到服务器上。 [
项目环境: 系统版本: centos6.6-x86kernel:2.6 HAproxy 版本: haproxy-1.5.2-2.el6.x86_64 Keepalived 版本: keepalived-1.2.13-4.el6.x86_64 拓扑结构: 前端使用 HAproxy 调度客户请求,部署 keepalived 避免单节点故障,有两个站点 www.test.com 和 www.dragon.com 的业务需求,后端部署四台服务器为两个站点做动静分离 , 把 www.dragon.com 的 DNS