GROUP# THREAD# SEQUENCE# STATUS FIRST_CHANGE#
---------- ---------- ---------- ---------------- -------------
1 1 27 ACTIVE 1831962
2 1 28 CURRENT 1935906
3 2 9 CURRENT 1955175
4 2 8 INACTIVE 1690602
由于redo wastage的存在,redo log file中间也会存在空白,那这部分空白会不会被丢弃呢?首先看下什么是redo wastage,简单的说就是LGWR进程在写redo log file的时候是按操作系统的标准块为单位进行写入的,具体块的大小,可以使用下述语句进行查询:
1. select max(l.lebsz) log_block_size_kccle
2. from sys.x$kccle l
3. where l.inst_id = userenv('Instance');
假设标准块大小为512字节,在一次写入操作中一共要写入1036字节数据,那么就需要3个标准块,尽管第三个块没有被写满,但是SGA中redo log写入的指针会跳转到下面一个块,这里的第三个块剩下的空间就被浪费了,这就是redo wastage。减少这种情况的方法就是减少commit次数。
下面通过实验观察redo wastage造成的空白会不会在归档的时候被丢弃:
--查看redo file大小
SQL> select group#,bytes/1024/1024 \"size(M)\" from v$log;
GROUP# size(M)
---------- ----------
1 50
2 50
3 50
--建立测试表
SQL> create table darren(id number,item varchar2(2));
Table created.
--查看当前归档的情况
SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;
SEQUENCE# ARC S COM
---------- --- - ---
81 YES A NO
82 YES A NO
83 YES A NO
84 YES A NO
85 YES A NO
86 YES A NO
87 YES A NO
88 YES A NO
89 YES A NO
90 YES A NO
--查看当前的redo size和redo wastage
SQL> select name,value from v$sysstat where name in('redo size','redo wastage');
NAME VALUE
--------------------- ------------------------------------------ ----------
redo size 258664912
redo wastage 86181420
--向测试表插入数据,产生redo记录
begin
for i in 1..500000 loop
insert into darren values(1,'aa');
commit;
end loop;
end;
--切换一起日志,将insert过程中产生的redo文件全部归档
SQL> alter system archive log current;
System altered.
--查看现在的redo size和redo wastage
SQL> select name,value from v$sysstat where name in('redo size','redo wastage');
NAME VALUE
---------- ------------
redo size 512888704
redo wastage 202172176
--计算insert过程中产生的redo size和redo wastage
SQL> select 512888704-258664912 redo from dual;
REDO
----------
254223792
SQL> select 202172176-86181420 wastage from dual;
WASTAGE
----------
115990756
--计算redo wastage的比例
SQL> select 115990756/254223792 from dual;
115990756/254223792
-------------------
.456254527
--查看insert 过程中产生的archive log file
SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;
SEQUENCE# ARC S COM
---------- --- - ---
81 YES A NO
82 YES A NO
83 YES A NO
84 YES A NO
85 YES A NO
86 YES A NO
87 YES A NO
88 YES A NO
89 YES A NO
90 YES A NO
91 YES A NO
92 YES A NO
93 YES A NO
94 YES A NO
95 YES A NO
96 YES A NO
97 YES A NO
98 YES A NO
99 YES A NO
从91号归档开始为本次insert操作产生的归档
--查看归档文件大小
[oracle@oracle11g archive]$ ls -trl