ORACLE数据库REDO日志切换频率在一定程度上可以反映业务的繁忙程度,正常来讲REDO日志每小时切换3次左右为最佳,当然不同的业务不同的需求,不能同日而语。
下面是网上流传较广的查询日志切换频率的SQL,与其说是查询日志切换频率,不如说是查询日志切换周期。
SQL> select sequence#,
2 first_time,
3 nexttime,
round(((first_time - nexttime) * 24) * 60, 2) diff
4 5 from (select sequence#,
6 first_time,
7 lag(first_time) over(order by sequence#) nexttime
from v$log_history
8 9 where thread# = 1)
10 order by sequence# desc;
SEQUENCE# FIRST_TIME NEXTTIME DIFF
---------- ------------------- ------------------- ----------
229 2015-06-02 22:14:41 2015-06-02 22:00:04 14.62
228 2015-06-02 22:00:04 2015-06-02 12:00:13 599.85
227 2015-06-02 12:00:13 2015-06-01 22:13:36 826.62
226 2015-06-01 22:13:36 2015-06-01 22:00:17 13.32
225 2015-06-01 22:00:17 2015-06-01 22:00:07 .17
224 2015-06-01 22:00:07 2015-06-01 12:00:07 600
223 2015-06-01 12:00:07 2015-05-31 22:12:30 827.62
222 2015-05-31 22:12:30 2015-05-31 22:02:29 10.02
221 2015-05-31 22:02:29 2015-05-31 16:00:13 362.27
220 2015-05-31 16:00:13 2015-05-31 06:00:13 600
219 2015-05-31 06:00:13 2015-05-30 22:11:24 468.82
218 2015-05-30 22:11:24 2015-05-30 22:01:26 9.97
217 2015-05-30 22:01:26 2015-05-30 18:00:12 241.23
216 2015-05-30 18:00:12 2015-05-30 09:00:48 539.4
215 2015-05-30 09:00:48 2015-05-30 05:00:37 240.18
214 2015-05-30 05:00:37 2015-05-29 22:10:15 410.37
213 2015-05-29 22:10:15 2015-05-29 22:00:04 10.18
这种查询方式查询的结果是日志切换的时间间隔,也就是两个相邻的日志切换的时间间隔,如果说是日志切换频率,很不直观。
在看下比较直观展现日志切换频率的SQL,这种方式目前网上基本还没有人分享。
SELECT TO_CHAR(first_time, 'MM/DD') DAY,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '00', 1, 0)) H00,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '01', 1, 0)) H01,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '02', 1, 0)) H02,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '03', 1, 0)) H03,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '04', 1, 0)) H04,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '05', 1, 0)) H05,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '06', 1, 0)) H06,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '07', 1, 0)) H07,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '08', 1, 0)) H08,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '09', 1, 0)) H09,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '10', 1, 0)) H10,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '11', 1, 0)) H11,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '12', 1, 0)) H12,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '13', 1, 0)) H13,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '14', 1, 0)) H14,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '15', 1, 0)) H15,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '16', 1, 0)) H16,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '17', 1, 0)) H17,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '18', 1, 0)) H18,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '19', 1, 0)) H19,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '20', 1, 0)) H20,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '21', 1, 0)) H21,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '22', 1, 0)) H22,
SUM(DECODE(TO_CHAR(first_time, 'HH24'), '23', 1, 0)) H23,
COUNT(*) TOTAL
FROM (SELECT ROWNUM RN, FIRST_TIME
FROM V$LOG_HISTORY
WHERE first_time > sysdate - 18
and FIRST_TIME > ADD_MONTHS(SYSDATE, -1)
ORDER BY FIRST_TIME)
GROUP BY TO_CHAR(first_time, 'MM/DD')
ORDER BY MIN(RN);
以下是SQL的查询结果,以查询18天之前的日志切换频率为例。
这种方式是查询每小时日志切换的次数,很直观的展示日志切换频率。如果在不同日期的同一时间,发现有很不协调的切换次数,就需要关注了。