当前位置: 首页 > 科技观察

Oracle数据库并行运行中常见等待事件和脚本详解

时间:2023-03-19 20:30:24 科技观察

今天主要介绍在Oracle数据库并行运行中slave进程和QC进程经常遇到的等待事件和常用脚本。1.PXDeq:ExecutionMsg,PXDeq:ExecuteReplyWaitingEvent1.PXDeq:ExecutionMsg在并行从机等待被告知要做什么时发生。这通常被认为是空闲事件,但在某些情况下可能会导致CPU过多。此事件在并行查询中很常见。该事件发生在PQslave进程等待QC告诉它做什么的时候(eg:等待被告知parse/execute/fetch等时。)v$session_wait中等待事件对应的参数:P1=sleeptime/senderidP2=passesP3=notused我们可以使用以下语句获取有关转换sleeptime/senderid的信息:setSERVEROUTPUTondefp1declareinstvarchar(20);sendervarchar(20);beginselectbitand(&&p1,16711680)-65535asSNDRINST,decode(bitand(&&p1,65535),65535,'QC','P'||to_char(bitand(&&p1,65535),'fm000'))asSNDRintoinst,senderfromdualwherebitand(&&p1,268435456)=268435456;dbms_output.put_line('Instance='||inst);dbms_output.put_line('Sender='||sender);end;/如果P1的值为空,表示slave不需要等待任何进程。比如p1的值为268501004,上面的sql会返回:Instance=1Sender=P012passes进程在获取信息之前依次等待的次数。这个等待事件是一个空闲等待事件。当这个等待事件发生时,进程会继续等待,并逐渐增加等待次数,直到获得信息!解决方案:Process作为Coordinator获取Slave进程接收数据时,响应太慢,导致部分Slave因为Queue满而等待,拖慢了整个并行执行的速度。这通常是由于CPU数量不足或系统上运行的进程过多造成的。考虑降低并行度。2.PXDeq:ExecuteReply当查询协调器正在等待来自并行从站的响应时发生。这通常被认为是空闲事件,但在某些情况下可能会导致CPU过多。WaitingProcess:QCcoordinatoriswaitingaslaveslave进程响应控制消息(确认通知)或期望来自从进程集的数据。这个等待事件的意思是QC等待slave执行完sql,将结果集发送给QCv$session_wait中等待事件对应的参数:P1=sleeptime/senderidP2=passesP3=notused我们可以用下面的语句来获取转换sleeptime/senderid相关信息:setSERVEROUTPUTonundefp1declareinstvarchar(20);sendervarchar(20);beginselectbitand(&&p1,16711680)-65535asSNDRINST,decode(bitand(&&p1,65535),65535,'QC','P'||to_char(bitand(&&p1,65535),'fm000'))asSNDRintoinst,senderfromdualwherebitand(&&p1,268435456)=268435456;dbms_output.put_line('Instance='||inst);dbms_output.put_line('Sender='||sender);结束;/ifP1值为空,表示slave不需要等待任何进程。比如p1的值为268501004,上面的sql会返回:Instance=1Sender=P012等待时间:这个是非空闲等待时间,QC等待slave的响应或者查询数据结果解决:非-optimizedsqlstatement可能是这个等待事件的原因:slaves执行sql语句的时间比较长,qc正在等待slave返回数据。优化sql,查看slave执行的语句及其执行计划,尽可能优化,减少slave执行sql语句的时间!2.相关脚本1.概述所有从站运行的并行查询。它显示从站是否正在等待以及它等待什么事件。selectdecode(px.qcinst_id,NULL,username,'-'||lower(substr(pp.SERVER_NAME,length(pp.SERVER_NAME)-4,4)))"用户名",decode(px.qcinst_id,NULL,'QC','(Slave)')"QC/Slave",to_char(px.server_set)"SlaveSet",to_char(s.sid)"SID",to_char(px.inst_id)"SlaveINST",decode(sw.state,'WAITING','WAIT','NOTWAIT')asSTATE,casesw.stateWHEN'WAITING'THENsubstr(sw.event,1,30)ELSENULLendaswait_event,decode(px.qcinst_id,NULL,to_char(s.sid),px.qcsid)"QCSID",to_char(px.qcinst_id)"QCINST",px。req_degree“Req.DOP”,px.degree“ActualDOP”fromgv$px_sessionpx,gv$sessions,gv$px_processpp,gv$session_waitswwherepx.sid=s.sid(+)andpx.serial#=s.serial#(+)andpx.inst_id=s.inst_id(+)andpx.sid=pp.sid(+)andpx.serial#=pp.serial#(+)andssw.sid=s.sidandssw.inst_id=s.inst_idorderbydecode(px.QCINST_ID,NULL,px.INST_ID,px.QCINST_ID),px.QCSID,decode(px.SERVER_GROUP,NULL,0,px.SERVER_GROUP),px.SERVER_SET,px.INST_ID/2。为PXDeq事件显示正在交换数据的进程。selectsw.SIDasRCVSID,decode(pp.server_name,NULL,'AQC',pp.server_name)asRCVR,sw.inst_idasRCVRINST,casesw.stateWHEN'WAITING'THENsubstr(sw.event,1,30)ELSENULLendaswait_event,decode(bitand(p1,65535),65535,'QC','P'||to_char(bitand(p1,65535),'fm000'))asSNDR,bitand(p1,16711680)-65535asSNDRINST,解码(bitand(p1,65535),65535,ps.qcsid,(selectsidfromgv$px_processwhereserver_name='P'||to_char(bitand(sw.p1,65535),'fm000')andinst_id=bitand(sw.p1,16711680)-65535))asSNDRSID,decode(sw.state,'WAITING','WAIT','NOTWAIT')asSTATEfromgv$session_waitsw,gv$px_processpp,gv$px_sessionpwheresw.sid=pp.sid(+)andsw.inst_id=pp.inst_id(+)andsw.sid=ps.sid(+)andsw.inst_id=ps.inst_id(+)andp1text='sleeptime/senderid'andbitand(p1,268435456)=268435456orderbydecode(ps.QCINST_ID,NULL,ps.INST_ID,ps.QCINST_ID),ps.QCSID,decode(ps.SERVER_GROUP,NULL,0,ps.SERVER_GROUP),ps.SERVER_SET,ps.INST_ID3。显示长时间运行的进程什么是奴隶do.selectdecode(px.qcinst_id,NULL,username,'-'||lower(substr(pp.SERVER_NAME,length(pp.SERVER_NAME)-4,4)))"Username",解码(px.qcinst_id,NULL,'QC','(Slave)')"QC/Slave",to_char(px.server_set)"SlaveSet",to_char(px.inst_id)"SlaveINST",substr(opname,1,30)operation_name,substr(target,1,30)target,sofar,totalwork,units,start_time,timestamp,decode(px.qcinst_id,NULL,to_char(s.sid),px.qcsid)"QCSID",to_char(px.qcinst_id)"QCINST"fromgv$px_sessionpx,gv$px_processpp,gv$session_longopsswherepx.sid=s.sidandpx.serial#=s.serial#andpx.inst_id=s.inst_idandpx.sid=pp.sid(+)andpx。serial#=pp.serial#(+)orderbydecode(px.QCINST_ID,NULL,px.INST_ID,px.QCINST_ID),px.QCSID,解码(px.SERVER_GROUP,NULL,0,px.SERVER_GROUP),px.SERVER_SET,px.INST_ID

猜你喜欢