1. 程式人生 > >查詢引起redo日誌暴增的SQL語句--指令碼

查詢引起redo日誌暴增的SQL語句--指令碼

此指令碼轉自樑敬彬老師的《收穫,不止SQL優化》,感謝老師的分享

redo日誌暴增會間接導致歸檔日誌數量增加,嚴重的會導致撐爆歸檔日誌的儲存空間,導致無法連線資料庫。
查詢最近幾天,每小時歸檔日誌產生數量--指令碼:
http://blog.csdn.net/u010692693/article/details/75309167

1. redo大量產生必然是由於大量產生"塊改變"。從awr檢視中找到"塊改變"最多的segment。

select * from (
SELECT to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI') snap_time,
       dhsso.object_name,
       SUM(db_block_changes_delta)
  FROM dba_hist_seg_stat     dhss,
       dba_hist_seg_stat_obj dhsso,
       dba_hist_snapshot     dhs
 WHERE dhs.snap_id = dhss.snap_id
   AND dhs.instance_number = dhss.instance_number
   AND dhss.obj# = dhsso.obj#
   AND dhss.dataobj# = dhsso.dataobj#
   AND begin_interval_time> sysdate - 120/1440
 GROUP BY to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI'),
          dhsso.object_name
 order by 3 desc)
 where rownum<=5;

SNAP_TIME        OBJECT_NAME                    SUM(DB_BLOCK_CHANGES_DELTA)
---------------- ------------------------------ ---------------------------
2017_07_19 01:00 TEST_REDO                                           222208
2017_07_19 01:00 WRH$_SYSMETRIC_HISTORY_INDEX                           112
2017_07_19 01:00 WRH$_PARAMETER_PK                                      112
2017_07_19 01:00 WRM$_SNAPSHOT_DETAILS                                   80
2017_07_19 01:00 WRI$_ADV_PARAMETERS_PK                                  48
這是查詢最近2小時(120分鐘)的,begin_interval_time> sysdate - 120/1440修改查詢最近多少分鐘的

2. 從awr檢視中找出步驟1中排序靠前的物件涉及的SQL。

SELECT to_char(begin_interval_time, 'YYYY_MM_DD HH24:MI'),
       dbms_lob.substr(sql_text, 4000, 1),
       dhss.instance_number,
       dhss.sql_id,
       executions_delta,
       rows_processed_delta
  FROM dba_hist_sqlstat dhss, dba_hist_snapshot dhs, dba_hist_sqltext dhst
 WHERE UPPER(dhst.sql_text) LIKE '%TEST_REDO%'
   AND dhss.snap_id = dhs.snap_id
   AND dhss.instance_Number = dhs.instance_number
   AND dhss.sql_id = dhst.sql_id;

TO_CHAR(BEGIN_INTERVAL_TIME,'Y DBMS_LOB.SUBSTR(SQL_TEXT,4000,                                                   INSTANCE_NUMBER SQL_ID        EXECUTIONS_DELTA ROWS_PROCESSED_DELTA
------------------------------ -------------------------------------------------------------------------------- --------------- ------------- ---------------- --------------------
2017_07_19 01:00               insert into  test_redo select * from test_redo                                                 1 g893rmm0rmjra                5              2685840
2017_07_19 01:00               insert into  test_redo select * from test_redo where rownum<=10000                             1 b7z56jkxs5jam               14               140000
2017_07_19 01:00               SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB               1 7q4g3xymr4yhz                3                    3
LIKE '%TEST_REDO%'中TEST_REDO是步驟1中查詢出來的OBJECT_NAME,可以替換您查詢的結果

3. 從ASH相關檢視找到執行這些SQL的session、module和machine。

select * from dba_hist_active_sess_history WHERE sql_id = 'g893rmm0rmjra';
select * from v$active_session_history where sql_Id = 'g893rmm0rmjra';
g893rmm0rmjra是SQL_ID,替換第二步查詢的結果SQL_ID列

4. dba_soure 看看是否有儲存過程包含這個SQL。