Oracle Parallel Execution并行执行Word文档格式.docx

上传人:b****2 文档编号:5799405 上传时间:2023-05-05 格式:DOCX 页数:25 大小:25.26KB
下载 相关 举报
Oracle Parallel Execution并行执行Word文档格式.docx_第1页
第1页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第2页
第2页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第3页
第3页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第4页
第4页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第5页
第5页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第6页
第6页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第7页
第7页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第8页
第8页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第9页
第9页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第10页
第10页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第11页
第11页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第12页
第12页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第13页
第13页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第14页
第14页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第15页
第15页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第16页
第16页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第17页
第17页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第18页
第18页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第19页
第19页 / 共25页
Oracle Parallel Execution并行执行Word文档格式.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Oracle Parallel Execution并行执行Word文档格式.docx

《Oracle Parallel Execution并行执行Word文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle Parallel Execution并行执行Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。

Oracle Parallel Execution并行执行Word文档格式.docx

这也是有时我们发现并行服务进程数量是并行度的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)。

一个查询能够并行执行,需要满足一下条件:

SQL语句中有Hint提示,比如Parallel或者Parallel_index.

SQL语句中引用的对象被设置了并行属性。

多表关联中,至少有一个表执行全表扫描(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

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

/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3048.trc

SQL>

altersessionsetevents'

10046tracenamecontextforever,level12'

;

会话已更改。

createtable怀宁parallel4asselect*fromdba_objects;

表已创建。

10046tracenamecontextoff'

;

这里用到了ORACLE的event时间。

10046事件是用来跟踪SQL语句的。

开启事件后,相关的信息会写道trace文件中,这也是之前我们查看trace文件名的原因。

关于event事件,参考我的blog:

Oracle跟踪事件setevent

有了trace文件,我们可以用tkprof工具,来查看trace文件的内容。

关于tkprof工具介绍,参考blog:

使用Tkprof分析ORACLE跟踪文件

进入trace目录,用tkprof命令生成txt文件,然后查看txt文件。

/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.

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使用这些对象中并行度最高的那个值作为当前执行的并行度。

Select/*+parallel(t4)*/count(*)fromt;

Altertabletparallel4;

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直接写到数据文件中,效率要比传统的加载方式高。

createtabletasselect*fromuser_tables;

selectsegment_name,extent_id,bytesfromuser_extentswheresegment_name='

T'

SEGMENT_NAEXTENT_IDBYTES

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

T065536

T165536

T265536

T365536

T465536

这里我们创建了一张表,分配了5个extents。

deletefromt;

已删除979行。

--

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2