应用反应sql慢,请帮忙分析awr,问题点在哪,谢谢



你这个库的问题好多哦。先改两点吧:
1、主要的原因就是有人在sqlplus里面执行4md2wf2czy2yr造成了阻塞,以后可以在非业务时间执行这些SQL
INSERT /*+ parallel */
INTO WA_HDS.M_ACCT_INFO (ACCT_NO, YM, DATA_DT, ACCT_TYPE, CREUNIT_NO, SRC_SYS_ID, SRC_DT, ETL_TIME, CUST_NO, UNIF_CUST_NO, CUST_NAME, ACCT_NAME, ACCT_INST_NO, PRD_NO, SUB_NO, BUSI_TYPE_CD, CURR_CD, DEP_DENE_CD, BAL_DIRE, ACCT_BAL, YSTD_BAL_DT, YSTD_BAL_DIRE, YSTD_BAL, CI_DT, END_DT, ACOP_BR, ACOP_TL, OPAC_DT, ACCL_BR, ACCL_TL, CLA_DT, RATE, USER_DT, SLEP_FLAG, INAC_FLAG, TBPW_FLAG, SBA_TYPE, ACCT_STAT, MAGER_NO, UPT_DT, DEPOS_MAN, ACCT_SFX, TRAN_DT, AGR_STR_DT, AGR_END_DT, AGR_DEP_AMT, AGR_DEP_ACCM, AGR_CACL_DT, AGR_MODIF_DT, AGR_DEP_FLAG, ACT_USD_AMT, ACT_RMB_AMT) SELECT /*+ parallel */ T1.ACCT_NO, T1.YM, T1.DATA_DT, '¶Ô˽»îÆÚ' ACCT_TYPE, T1.CREUNIT_NO, T1.SRC_SYS_ID, T1.SRC_DT, T1.ETL_TIME, T1.CUST_NO, T1.UNIF_CUST_NO, T1.CUST_NAME, T1.ACCT_NAME, T1.ACCT_INST_NO, T1.PRD_NO, T1.SUB_NO, T1.BUSI_TYPE_CD, T1.CURR_CD, T1.DEP_DENE_CD, T1.BAL_DIRE, T1.ACCT_BAL, T1.YSTD_BAL_DT, T1.YSTD_BAL_DIRE, T1.YS TD_BAL, T1.CI_DT, '', T2.ACCT_INST_NO, T2.OPAC_CLAC_TELR, T1.OPAC_DT, T3.ACCT_INST_NO, T3.OPAC_CLAC_TELR, T1.CLA_DT, T1.RATE, T1.USER_DT, T1.SLEP_FLAG, T1.INAC_FLAG, T1.TBPW_FLAG, T1.SBA_TYPE, T1.ACCT_STAT, T1.MAGER_NO, T1.UPT_DT, T1.DEPOS_MAN, T1.ACCT_SFX, T1.TRAN_DT, '', '', 0, 0, '', '', '', TRUNC(ROUND(T1.ACCT_BAL * T4.COVE_RATE /
( SELECT COVE_RATE
FROM WA_HDS.L_COM_EXCH_RATE_INFO
WHERE DATA_DT = :B1
AND CURR_CD = 'USD'), 2), 2) ACT_RMB_AMT, TRUNC(ROUND(T1.ACCT_BAL * T4.COVE_RATE / 100, 2), 2) ACT_RMB_AMT
FROM WA_HDS.L_AGR_DEP_PSN_SV_ACCT_INFO T1 LEFT
JOIN
( SELECT ACCT_NO, ACCT_INST_NO, OPAC_CLAC_TELR
FROM WA_HDS.L_EVT_OPAC_CLAC_SER_INFO
WHERE OPAC_CLAC_FLAG = '1') T2
ON T1.ACCT_NO = T2.ACCT_NO LEFT
JOIN
( SELECT ACCT_NO, ACCT_INST_NO, OPAC_CLAC_TELR
FROM WA_HDS.L_EVT_OPAC_CLAC_SER_INFO
WHERE OPAC_CLAC_FLAG = '0') T3
ON T1.ACCT_NO = T3.ACCT_NO LEFT
JOIN
( SELECT CURR_CD, COVE_RATE
FROM WA_HDS.L_COM_EXCH_RATE_INFO
WHERE DATA_DT = :B1 ) T4
ON T1.CU RR_CD = T4.CURR_CD
2、将数据库的SGA和PGA加大,例如:30G+10G


这个库的主要是跑批的,那语句是每天都会跑的,以前都没问题。这两天一跑就很慢。
目前sga+pga是15g+8g需要把它调得再大些么


先看下你卡顿时间段涉及比较多的DML操作是什么
–统计0点到8点涉及DML操作的sql
select b.*
from (
select t.sql_id,
t.module,
(select to_char(dbms_lob.substr(sql_text, 20, 1)) from sys.wrhsqltextwheresqlid=t.sqlidandrownum<=1)sqltext1,tochar(s.beginintervaltime,′yyyy−mm−ddhh24′)beginintervaltime1,tochar(t.rowsprocesseddelta,′9999,9999,9999′)rowsprocesseddelta,round((ratiotoreport(rowsprocesseddelta)over())∗100,2)rtrrow,t.executionsdelta,tochar(t.rowsprocesseddelta/(t.executionsdelta+1),′9999,999999′)rowexecfromsys.wrh_sqlstat t, wrm$_snapshot s
where t.dbid = s.dbid
and t.snap_id = s.snap_id
and s.begin_interval_time >= to_date(to_char(trunc(sysdate),‘yyyy-mm-dd’) ||‘00:00:00’,‘yyyy-mm-dd hh24:mi:ss’)
and s.begin_interval_time <= to_date(to_char(trunc(sysdate) ,‘yyyy-mm-dd’)||‘08:00:00’,‘yyyy-mm-dd hh24:mi:ss’)
order by t.snap_id desc
) b
where (upper(sql_text1) like ‘%INSERT%’ or
upper(sql_text1) like ‘%DELETE%’ or
upper(sql_text1) like ‘%UPDATE%’)
order by rows_processed_delta


然后看下这段时间的等待事件和相关sql
–查看故障时间段等待事件、问题sql id及会话访问次数
select trunc(sample_time, ‘mi’) tm, sql_id, nvl(event,‘CPU’),count(distinct session_id) cnt
from dba_hist_active_sess_history
where sample_time between to_date(‘2019-09-05 09:30:00’) and
to_date(‘2019-09-05 10:30:00’)
group by trunc(sample_time, ‘mi’), sql_id,nvl(event,‘CPU’)
order by cnt desc;


再看下是不是存在阻塞lock信息
–查看当前被阻塞lock信息(waiter)
–注: 如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
–如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
–如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
–如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。
SELECT INST_ID “实例ID”,
SID,
SERIAL#,
PROCESS,
USERNAME,
SCHEMANAME,
OSUSER,
MACHINE,
PROGRAM,
SQL_ID,
MODULE,
ACTION,
LOCKWAIT,
BLOCKING_SESSION_STATUS,
BLOCKING_INSTANCE ,
BLOCKING_SESSION ,
EVENT ,
WAIT_CLASS,
LOGON_TIME,
CASE
WHEN STATE = ‘WAITING’ THEN
SECONDS_IN_WAIT
WHEN STATE = ‘WAITING KNOWN TIME’ THEN
WAIT_TIME
END,
STATE
FROM GV$SESSION
WHERE USERNAME IS NOT NULL
AND STATUS = ‘ACTIVE’
AND LOCKWAIT IS NOT NULL;
–查看阻塞会话SID信息(holder)
–考虑到多实例会存在sid一致的情况,所以加了实例区分
SELECT INST_ID “实例ID”,
SID,
SERIAL#,
PROCESS,
USERNAME,
SCHEMANAME,
OSUSER,
MACHINE,
PROGRAM,
SQL_ID,
MODULE,
ACTION,
LOCKWAIT,
BLOCKING_SESSION_STATUS,
BLOCKING_INSTANCE,
BLOCKING_SESSION,
EVENT,
WAIT_CLASS,
LOGON_TIME,
CASE
WHEN STATE = ‘WAITING’ THEN
SECONDS_IN_WAIT
WHEN STATE = ‘WAITING KNOWN TIME’ THEN
WAIT_TIME
END,
STATE
FROM GV$SESSION
WHERE INST_ID = ‘&INSTANCE’
and SID = ‘&SID’;


