Oracle Parallel Execution并行执行.docx
- 文档编号:3225057
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:25
- 大小:25.26KB
Oracle Parallel Execution并行执行.docx
《Oracle Parallel Execution并行执行.docx》由会员分享,可在线阅读,更多相关《Oracle Parallel Execution并行执行.docx(25页珍藏版)》请在冰点文库上搜索。
OracleParallelExecution并行执行
OracleParallelExecution(并行执行)
一. 并行(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*fromemployeesorderbylast_name;
假设employees表中last_name列上没有索引,并且并行度为4,此时并行协调进程会分配4个并行服务进程对表employees进行全表扫描操作,因为需要对结果集进行排序,所以并行协调进程会额外启用4个并行服务进程,用于处理4个进程传送过来的数据,这新启用的用户处理传递过来数据的进程称为父进程,用户传出数据(最初的4个并行服务进程)成为子进程,这样整个并行处理过程就启用了8个并行服务进程。
其中每个单独的并行服务进程的行为叫作并行的内部操作,而并行服务进程之间的数据交流叫做并行的交互操作。
这也是有时我们发现并行服务进程数量是并行度的2倍,就是因为启动了并行服务父进程操作的缘故。
三.读懂一个并行处理的执行计划
CREATETABLEemp2ASSELECT*FROMemployees;
ALTERTABLEemp2PARALLEL2;
EXPLAINPLANFOR
SELECTSUM(salary)FROMemp2GROUPBYdepartment_id;
SELECTPLAN_TABLE_OUTPUTFROMTABLE(DBMS_XPLAN.DISPLAY());
--------------------------------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|TQ|IN-OUT|PQDistrib|
--------------------------------------------------------------------------------------------------------
|0|SELECTSTATEMENT||107|2782|3(34)||||
|1|PXCOORDINATOR||||||||
|2|PXSENDQC(RANDOM)|:
TQ10001|107|2782|3(34)|Q1,01|P->S|QC(RAND)|
|3|HASHGROUPBY||107|2782|3(34)|Q1,01|PCWP||
|4|PXRECEIVE||107|2782|3(34)|Q1,01|PCWP||
|5|PXSENDHASH|:
TQ10000|107|2782|3(34)|Q1,00|P->P|HASH|
|6|HASHGROUPBY||107|2782|3(34)|Q1,00|PCWP||
|7|PXBLOCKITERATOR||107|2782|2(0)|Q1,00|PCWP||
|8|TABLEACCESSFULL|EMP2|107|2782|2(0)|Q1,00|PCWP||
-------------------------------------------------------------------------------
通过执行计划,我们来看一下它的执行步骤:
(1)并行服务进程对EMP2表进行全表扫描。
(2)并行服务进程以ITERATOR(迭代)方式访问数据块,也就是并行协调进程分给每个并行服务进程一个数据片,在这个数据片上,并行服务进程顺序地访问每个数据块(Iterator),所有的并行服务进程将扫描的数据块传给另一组并行服务进程(父进程)用于做HashGroup操作。
(3)并行服务父进程对子进程传递过来的数据做HashGroup操作。
(4)并行服务进程(子进程)将处理完的数据发送出去。
(5)并行服务进程(父进程)接收到处理过的数据。
(6)合并处理过的数据,按照随即的顺序发给并行协调进程(QC:
QueryConordinator)。
(7)并行协调进程将处理结果发给用户。
当使用了并行执行,SQL的执行计划中就会多出一列:
in-out。
该列帮助我们理解数据流的执行方法。
它的一些值的含义如下:
ParalleltoSerial(P->S):
表示一个并行操作发送数据给一个串行操作,通常是并行incheng将数据发送给并行调度进程。
ParalleltoParallel(P->P):
表示一个并行操作向另一个并行操作发送数据,疆场是两个从属进程之间的数据交流。
ParallelCombinedwithparent(PCWP):
同一个从属进程执行的并行操作,同时父操作也是并行的。
ParallelCombinedwithChild(PCWC):
同一个从属进程执行的并行操作,子操作也是并行的。
SerialtoParallel(S->P):
一个串行操作发送数据给并行操作,如果select部分是串行操作,就会出现这个情况。
四.并行执行等待事件
在做并行执行方面的性能优化的时候,可能会遇到如下等待时间:
PXDeqCredit:
sendblkd
这是一个有并行环境的数据库中,从statspack或者AWR中经常可以看到的等待事件。
在Oracle9i里面,这个等待时间被列入空闲等待。
关于等待时间参考:
Oracle常见的33个等待事件
一般来说空闲等待可以忽略它,但是实际上空闲等待也是需要关注的,因为一个空闲的等待,它反映的是另外的资源已经超负荷运行了。
基于这个原因,在Oracle10g里已经把PXDeqCredit:
sendblkd等待时间不在视为空闲等待,而是列入了Others等待事件范围。
PXDeqCredit:
sendblkd等待事件的意思是:
当并行服务进程向并行协调进程QC(也可能是上一层的并行服务进程)发送消息时,同一时间只有一个并行服务进程可以向上层进程发送消息,这时候如果有其他的并行服务进程也要发送消息,就只能等待了。
知道获得一个发送消息的信用信息(Credit),这时候会触发这个等待事件,这个等待事件的超时时间为2秒钟。
如果我们启动了太多的并行进程,实际上系统资源(CPU)或者QC无法即时处理并行服务发送的数据,那么等待将不可避免。
对于这种情况,我们就需要降低并行处理的并行度。
当出现PXDeqCredit:
sendblkd等待的时间很长时,我们可以通过平均等待时间来判断等待事件是不是下层的并行服务进程空闲造成的。
该等待事件的超时时间是2秒,如果平均等待时间也差不多是2秒,就说明是下层的并行进程“无事所做”,处于空闲状态。
如果和2秒的差距很大,就说明不是下层并行服务超时导致的空闲等待,而是并行服务之间的竞争导致的,因为这个平均等待事件非常短,说明并行服务进程在很短时间的等待之后就可以获取资源来处理数据。
所以对于非下层的并行进程造成的等待,解决的方法就是降低每个并行执行的并行度,比如对象(表,索引)上预设的并行度或者查询Hint指定的并行度。
五.并行执行的使用范围
Oracle的并行技术在下面的场景中可以使用:
(1) ParallelQuery(并行查询)
(2) ParallelDDL(并行DDL操作,如建表,建索引等)
(3) ParallelDML(并行DML操作,如insert,update,delete等)
5.1并行查询
并行查询可以在查询语句,子查询语句中使用,但是不可以使用在一个远程引用的对象上(如DBLINK)。
一个查询能够并行执行,需要满足一下条件:
(1) SQL语句中有Hint提示,比如Parallel或者Parallel_index.
(2) SQL语句中引用的对象被设置了并行属性。
(3) 多表关联中,至少有一个表执行全表扫描(Fulltablescan)或者跨分区的IndexrangeSCAN。
如:
select/*+parallel(t4)*fromt;
5.2并行DDL操作
5.2.1表操作的并行执行
以下表操作可以使用并行执行:
CREATETABLE…ASSELECT
ALTERTABLE…movepartition
Altertable…splitpartition
Altertable…coalescepartition
DDL操作,我们可以通过trace文件来查看它的执行过程。
示例:
查看当前的trace文件:
/*Formattedon2010/8/3123:
33:
00(QP5v5.115.810.9015)*/
SELECTu_dump.VALUE
||'/'
||db_name.VALUE
||'_ora_'
||v$process.spid
||NVL2(v$process.traceid,'_'||v$process.traceid,NULL)
||'.trc'
"TraceFile"
FROMv$parameteru_dump
CROSSJOIN
v$parameterdb_name
CROSSJOIN
v$process
JOIN
v$session
ONv$process.addr=v$session.paddr
WHEREu_dump.name='user_dump_dest'
ANDdb_name.name='db_name'
ANDv$session.audsid=SYS_CONTEXT('userenv','sessionid');
TraceFile
------------------------------------------------------------------------------
d:
/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_5836.trc
d:
/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3048.trc
SQL>altersessionsetevents'10046tracenamecontextforever,level12';
会话已更改。
SQL>createtable怀宁parallel4asselect*fromdba_objects;
表已创建。
SQL>altersessionsetevents'10046tracenamecontextoff';
会话已更改。
这里用到了ORACLE的event时间。
10046事件是用来跟踪SQL语句的。
开启事件后,相关的信息会写道trace文件中,这也是之前我们查看trace文件名的原因。
关于event事件,参考我的blog:
Oracle跟踪事件setevent
有了trace文件,我们可以用tkprof工具,来查看trace文件的内容。
关于tkprof工具介绍,参考blog:
使用Tkprof分析ORACLE跟踪文件
进入trace目录,用tkprof命令生成txt文件,然后查看txt文件。
d:
/app/Administrator/diag/rdbms/orcl/orcl/trace>tkproforcl_ora_3048.trc安庆.txtsys=no
TKPROF:
Release11.2.0.1.0-Developmenton星期二8月3123:
45:
252010
Copyright(c)1982,2009,Oracleand/oritsaffiliates.Allrightsreserved.
d:
/app/Administrator/diag/rdbms/orcl/orcl/trace>
5.2.2创建索引的并行执行
创建索引时使用并行方式在系统资源充足的时候会使性能得到很大的提高,特别是在OLAP系统上对一些很大的表创建索引时更是如此。
以下的创建和更改索引的操作都可以使用并行:
Createindex
Alterindex…rebuild
Alterindex…rebuildpartition
Alterindex…splitpartition
一个简单的语法:
createindext_indont(id)parallel4;
监控这个过程和5.2.1中表一样,需要通过10046事件。
这里就不多说了。
有关减少创建时间方法,参考blog:
如何加快建index索引的时间
总结:
使用并行方式,不论是创建表,修改表,创建索引,重建索引,他们的机制都是一样的,那就是Oracle给每个并行服务进程分配一块空间,每个进程在自己的空间里处理数据,最后将处理完毕的数据汇总,完成SQL的操作。
5.3并行DML操作
Oracle可以对DML操作使用并行执行,但是有很多限制。
如果我们要让DML操作使用并行执行,必须显示地在会话里执行如下命令:
SQL>altersessionenableparalleldml;
会话已更改。
只有执行了这个操作,Oracle才会对之后符合并行条件的DML操作并行执行,如果没有这个设定,即使SQL中指定了并行执行,Oracle也会忽略它。
5.3.1delete,update和merge操作
Oracle对Delete,update,merge的操作限制在,只有操作的对象是分区表示,Oracle才会启动并行操作。
原因在于,对于分区表,Oracle会对每个分区启用一个并行服务进程同时进行数据处理,这对于非分区表来说是没有意义的。
5.3.2Insert的并行操作
实际上只有对于insertinto…select…这样的SQL语句启用并行才有意义。
对于insertinto..values…并行没有意义,因为这条语句本身就是一个单条记录的操作。
Insert并行常用的语法是:
Insert/*+parallel(t2)*/intotselect/*+parallel(t12)*/*fromt1;
这条SQL语句中,可以让两个操作insert和select分别使用并行,这两个并行是相互独立,互补干涉的,也可以单独使用其中的一个并行。
六.并行执行的设定
6.1并行相关的初始话参数
6.1.1parallel_min_servers=n
在初始化参数中设置了这个值,Oracle在启动的时候就会预先启动N个并行服务进程,当SQL执行并行操作时,并行协调进程首先根据并行度的值,在当前已经启动的并行服务中条用n个并行服务进程,当并行度大于n时,Oracle将启动额外的并行服务进程以满足并行度要求的并行服务进程数量。
6.1.2parallel_max_servers=n
如果并行度的值大于parallel_min_servers或者当前可用的并行服务进程不能满足SQL的并行执行要求,Oracle将额外创建新的并行服务进程,当前实例总共启动的并行服务进程不能超过这个参数的设定值。
6.1.3parallel_adaptive_multi_user=true|false
Oracle10gR2下,并行执行默认是启用的。
这个参数的默认值为true,它让Oracle根据SQL执行时系统的负载情况,动态地调整SQL的并行度,以取得最好的SQL执行性能。
6.1.4parallel_min_percent
这个参数指定并行执行时,申请并行服务进程的最小值,它是一个百分比,比如我们设定这个值为50.当一个SQL需要申请20个并行进程时,如果当前并行服务进程不足,按照这个参数的要求,这个SQL比如申请到20*50%=10个并行服务进程,如果不能够申请到这个数量的并行服务,SQL将报出一个ORA-12827的错误。
当这个值设为Null时,表示所有的SQL在做并行执行时,至少要获得两个并行服务进程。
6.2并行度的设定
并行度可以通过以下三种方式来设定:
(1)使用Hint指定并行度。
(2)使用altersessionforceparallel设定并行度。
(3)使用SQL中引用的表或者索引上设定的并行度,原则上Oracle使用这些对象中并行度最高的那个值作为当前执行的并行度。
示例:
SQL>Select/*+parallel(t4)*/count(*)fromt;
SQL>Altertabletparallel4;
SQL>Altersessionforceparallelqueryparallel4;
Oracle默认并行度计算方式:
(1)Oracle根据CPU的个数,RAC实例的个数以及参数parallel_threads_per_cpu的值,计算出一个并行度。
(2)对于并行访问分区操作,取需要访问的分区数为并行度。
并行度的优先级别从高到低:
Hint->altersessionforceparallel->表,索引上的设定->系统参数
实际上,并行只有才系统资源比较充足的情况下,才会取得很好的性能,如果系统负担很重,不恰当的设置并行,反而会使性能大幅下降。
七.直接加载
在执行数据插入或者数据加载的时候,可以通过appendhint的方式进行数据的直接加载。
在insert的SQL中使用APPEND,如:
Insert/*+append*/intotselect*fromt1;
还可以在SQL*LOADER里面使用直接加载:
Sqlldruserid=user/pwdcontrol=load.ctldirect=true
Oracle执行直接加载时,数据直接追加到数据段的最后,不需要花费时间在段中需找空间,数据不经过databuffer直接写到数据文件中,效率要比传统的加载方式高。
示例:
SQL>createtabletasselect*fromuser_tables;
表已创建。
SQL>selectsegment_name,extent_id,bytesfromuser_extentswheresegment_name='T';
SEGMENT_NAEXTENT_IDBYTES
------------------------------
T065536
T165536
T265536
T365536
T465536
这里我们创建了一张表,分配了5个extents。
SQL>deletefromt;
已删除979行。
SQL>selectsegment_name,extent_id,bytesfromuser_extentswheresegment_name='T';
SEGMENT_NAEXTENT_IDBYTES
--
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle Parallel Execution并行执行 Execution 并行 执行