我们知道,Nologging只在很少情况下生效
通常,DML操作总是要生成redo的
这个我们不多说.
关于Nologging和append,一直存在很多误解.
经过一系列研究,终于发现了Nologging的真相.
我们来看一下测试:
1.Nologging的设置跟数据库的运行模式有关
a.数据库运行在非归档模式下:
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1071333376 bytes
Fixed Size 1375792 bytes
Variable Size 721420752 bytes
Database Buffers 343932928 bytes
Redo Buffers 4603904 bytes
数据库装载完毕。
SQL> alter database noarchivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 D:\app\Administrator\oradata\recover_file\SDXJ\ARCHIVELOG
最早的联机日志序列 201
当前日志序列 203
SQL>
###创建普通表
create table sdxj.redo1 as select * fromdba_objects where 1=2;
Table created.
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 8956324 2 ---初始
---直接insert 数据
insert into sdxj.redo1 select * fromdba_objects;
commit;
10947 rows created.
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 17434976 2 ---插入数据后
--- /*+ append */ 插入数据
SQL> select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 17434976 2 ---apped 初始redo
insert /*+append*/ into sdxj.redo1 select * fromdba_objects;
commit;
10947 rows created.
SQL> select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
redo size 17486416 2 ----append 后的redo
---append+ nologging
--- /*+append */ 插入数据
alter table sdxj.redo1 nologging;
SQL> select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 20665548 2 ---apped + no 初始redo
insert /*+append*/ into sdxj.redo1 select * fromdba_objects;
commit;
SQL> select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ---------
redo size 20694972 2 ---apped + no 后redo
select (17434976-8956324) insrt ,(17486416-17434976) appe,(20694972-20665548) appeno from dual;
8478652 51440 29424
---create table 命令创建表
create table sdxj.redo7 as select * fromdba_objects;
create table sdxj.redo8 nologging as select * fromdba_objects;
Table created.
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 19261692 2 ---create table 初始值
redo size 19344232 2 --create table 后值
redo size 19428120 2 --create table nologging 后值
---比较
select 19344232-19261692,19428120-19344232 from dual;
82540 83888
在非归档模式下:
INSERT INTO > CREATE TABLE > INSERT/*+APPEND */ > INSERT /*+APPEND */ (NOLOGGING)
b、数据库运行在归档模式下
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1071333376 bytes
Fixed Size 1375792 bytes
Variable Size 721420752 bytes
Database Buffers 343932928 bytes
Redo Buffers 4603904 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 D:\app\Administrator\oradata\recover_file\SDXJ\ARCHIVELOG
最早的联机日志序列 203
下一个存档日志序列 205
当前日志序列 205
SQL>
###创建普通表
create table sdxj.redo1 as select * fromdba_objects where 1=2;
Table created.
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 275668 2 ---初始
---直接insert 数据
insert into sdxj.redo1 select * fromdba_objects;
commit;
10947 rows created.
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 8739776 2 ---插入数据后
--- /*+ append */ 插入数据
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 8748144 2 ---apped 初始redo
insert /*+append*/ into sdxj.redo1 select * fromdba_objects;
commit;
10947 rows created.
SQL> select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
redo size 17293020 2 ----append 后的redo
---append+ nologging
--- /*+append */ 插入数据
alter table sdxj.redo1 nologging;
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ----------
redo size 17301584 2 ---apped + no 初始redo
insert /*+append*/ into sdxj.redo1 select * fromdba_objects;
commit;
select name,value,class fromv$sysstat where name='redosize';
NAME VALUE CLASS
---------- ---------- ---------
redo size 17330464 2 ---apped + no 后redo
select (8739776-275668) insrt ,( 17293020-8748144) appe,(17330464-17301584) appeno from dual;
8464108 8544876 28880
---create table 命令创建表
select name,value,class fromv$sysstat where name='redosize';
redo size 17358384 2 ---create table redo
create table sdxj.redo2 as select * fromdba_objects;
select name,value,class fromv$sysstat where name='redosize';
redo size 25952108 2 ---
select name,value,class fromv$sysstat where name='redosize';
redo size 26996488 2 ---
create table sdxj.redo3 nologging as select * fromdba_objects;
select name,value,class fromv$sysstat where name='redosize';
redo size 27108512 2 ---
---比较
select 25952108-17358384,27108512-26996488 from dual;
8593724 112024
归档模式下:create table nologgingcreate table nologging
Insert into >create table >INSERT /*+APPEND */ >create table nologging > INSERT /*+APPEND */ (NOLOGGING).