Oracle_导入大批量数据到表中的方法

我们知道,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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值