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

来源:互联网 发布:魔域登陆器源码 编辑:程序博客网 时间:2024/05/29 02:12

我们知道,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.redo1as select * fromdba_objects where 1=2;

 

Table created.

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    8956324     2   ---初始

 

---直接insert数据

insert into sdxj.redo1select * fromdba_objects;

commit;

 

10947 rows created.

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    17434976    2           ---插入数据后

 

--- /*+ append */ 插入数据

 

SQL> selectname,value,class fromv$sysstatwhere name='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    17434976    2     ---apped初始redo

 

 insert /*+append*/into  sdxj.redo1 select * fromdba_objects;

 commit;

 

10947 rows created.

 

SQL> selectname,value,class fromv$sysstatwhere name='redosize';

 

NAME            VALUE      CLASS

redo size    17486416    2     ----append后的redo

 

 ---append+ nologging

 

 --- /*+append */ 插入数据

 

 alter table  sdxj.redo1nologging;

 

SQL> selectname,value,class fromv$sysstatwhere name='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    20665548    2     ---apped + no初始redo

 

 insert /*+append*/into  sdxj.redo1 select * fromdba_objects;

 commit;

 

SQL> selectname,value,class fromv$sysstatwhere name='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ---------

redo size    20694972    2     ---apped + noredo

 

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.redo8nologging as select * fromdba_objects;

 

Table created.

 

select name,value,classfromv$sysstat wherename='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-19344232from 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.redo1as select * fromdba_objects where 1=2;

 

Table created.

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    275668     2   ---初始

 

---直接insert数据

 

insert into sdxj.redo1select * fromdba_objects;

commit;

 

10947 rows created.

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    8739776    2           ---插入数据后

 

--- /*+ append */ 插入数据

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    8748144    2     ---apped初始redo

 

 insert /*+append*/into  sdxj.redo1 select * fromdba_objects;

 commit;

 

10947 rows created.

 

SQL> selectname,value,class fromv$sysstatwhere name='redosize';

 

NAME            VALUE      CLASS

redo size    17293020    2     ----append后的redo

 

 ---append+ nologging

 

 --- /*+append */ 插入数据

 

 alter table  sdxj.redo1nologging;

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ----------

redo size    17301584    2     ---apped + no初始redo

 

 insert /*+append*/into  sdxj.redo1 select * fromdba_objects;

 commit;

 

select name,value,classfromv$sysstat wherename='redosize';

 

NAME            VALUE      CLASS

---------- ---------- ---------

redo size    17330464    2     ---apped + noredo

 

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,classfromv$sysstat wherename='redosize';

redo size    25952108    2    ---

 

select name,value,classfromv$sysstat wherename='redosize';

redo size    26996488    2    ---

 

create table sdxj.redo3nologging as select * fromdba_objects;

 

select name,value,classfromv$sysstat wherename='redosize';

redo size    27108512    2    ---

 

---比较

 

select 25952108-17358384,27108512-26996488from dual;

 

8593724                    112024

 

归档模式下:create table nologgingcreate table nologging

Insert into >create table >INSERT /*+APPEND */ >create table nologging  > INSERT /*+APPEND */ (NOLOGGING).

0 0