概述
之前在系統告警(淩晨)想要看一下日志切換頻率和涉及到比較多的DML操作的一些sql,如果是在工作時間還可以直接查目前超過3秒之類的sql,淩晨的話就比較麻煩了,得通過sql_text和sys.wrh$_sqlstat , wrm$_snapshot 來聯合查了。下面分享下相關的腳本:

檢視某個時間段事務量最多的sql
通過wrh$_sqlstat , wrm$_snapshot聯合查詢來看指定時間段涉及到INSERT、DELETE、update操作的相關sql,按事務量來做排序。
set line 200col sql_text1 format a40col module format a30select b.* from (select t.sql_id, t.module, (select to_char(dbms_lob.substr(sql_text, 20, 1)) from sys.wrh$_sqltext where sql_id = t.sql_id and rownum <=1) sql_text1, to_char(s.begin_interval_time, 'yyyy-mm-dd hh24') begin_interval_time1, to_char(t.rows_processed_delta, '9999,9999,9999') rows_processed_delta, round((ratio_to_report(rows_processed_delta) over ())*100,2) rtr_row, t.executions_delta, to_char(t.rows_processed_delta/(t.executions_delta+1),'9999,999999') row_exec from sys.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
檢視redo日志切換頻率
通過redo日志切換的頻率來看下某段時間是不是涉及到INSERT、DELETE、update操作的比較多。
select to_char(first_time,'YYYY-mm-dd') LOG_DATE, to_char(first_time,'HH24') LOG_HOUR, count(*) SWITCHES from v$loghist group by to_char(first_time,'YYYY-mm-dd') , to_char(first_time,'HH24') order by 1,2;
如果在生産環境中碰到checkpoint not complete一般就是INSERT、DELETE、update操作比較多,導緻redo日志切換過快,這裡也可以考慮直接增加redo日志大小,但是建議通過上面sql找到問題redo日志切換比較頻繁的時間段,然後查該時間段涉及比較多INSERT、DELETE、update事務操作的sql,例如淩晨2點在插入一張資料量很大的中間表也會導緻上面問題的發生。
後面會分享更多關于devops和DBA方面内容,感興趣的朋友可以關注下!