现在的位置: 首页 > 综合 > 正文

并行执行!

2013年12月07日 ⁄ 综合 ⁄ 共 2411字 ⁄ 字号 评论关闭

并行处理内部的机制:

首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递,这个协调进程将需要操作的数据集分割成很多部分,称为并行处理单元;然后并行协调进程给每个并行进程分配一个数据单元。比如有四个并行服务进程,他们就会同时处理各自分配的单元,当一个并行服务进程处理完毕后,协调进程就会给它分配另外的单元,如此反复,直到整个表上的数据都处理完,最后协调进程负责将每个小集合合并成一个大集合作为最终执行的结果返回给用户。

实际上在一个并行执行过程中,还存在着并行服务进程之间的通信问题。当一个并行服务进程需要做两件事的时候,它就会再启用一个进程来配合当前的进程完成一个工作,比如这样一条sql语句:select * from emploees order by last_name;

假设emploees表中last_name列上没有索引,并且并行度为4,此时并行协调进程会分配4个并行服务进程对表emploees进行全表扫描,因为需要对结果集进行排序,所以并行协调进程会额外启用4个并行服务进程,用于处理前4个进程传递过来的数据,这新启用的用户处理传递过来的数据的进程成为父进程,用户传出数据的进程成为子进程,这样整个并行处理过程就启用了8个并行服务进程,如下图所示:

有4个并行服务进程负责对表进行数据扫描(子进程),另外4个并行服务进程负责数据的排序(父进程),它们同时并行工作,子进程实时将扫描的数据传递给父进程,父进程同时将数据排序。最后父进程将所有的排序数据传递给并行服务协调进程,由它将最终结果反给用户,这就是一个并行处理的内部机制。有时候我们发现并行服务进程数量是并行度的2倍时,就是因为启用了并行服务父进程操作的缘故。

首先要解释一下执行计划中的IN-OUT部分的含义:

parallel to serial(P->S):表示一个并行操作发送数据给一个串行操作,通常是并行进程将数据发送给并行调度进程。

parallel to parallel(P->P):表示一个并行操作向另一个并行操作发送数据,经常是两个从属进程之间的数据交流。

serial to parallel(S->P):表示一个串行操作发送数据给并行操作。

parallel combined with parent(PCWP):同一个从属进程执行的并行操作,同时父操作也是并行的。

parallel combined with child(PCWC):同一个从属进程执行的并行操作,子操作也是并行的。

读懂一个并行处理的执行计划:

SQL> select /*+ parallel(t2,4) */ count(status) from t2 group by object_id;
已用时间:  00: 00: 00.01

执行计划
----------------------------------------------------------
Plan hash value: 3945466685

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

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

第一步:并行服务进程对T2表进行全表扫描操作。

第二步:并行服务进程以ITERATOR(迭代)方式访问数据块,也就是并行协调进程给每个并行服务进程一个数据片,在这个数据片上,并行服务进程顺序的访问每个数据块,所有的并行服务进程将扫描的数据块传给另一组并行服务进程(父进程)用于做GROUP BY操作。

第三步:并行服务父进程对子进程传递过来的数据做GROUP BY操作。

第四步:并行服务进程(子进程)将处理完的数据发送出去。

第五步:并行服务进程(父进程)接收到处理过的数据。

第六步:合并处理过的数据。

第七部:并行协调进程将处理结果发给用户。

抱歉!评论已关闭.