C:\Users\Admin>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 4 13:24:02 2016
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\oracle\arch
最早的联机日志序列 1651
下一个存档日志序列 1653
当前日志序列 1653
SQL> create table bruce5 as select * from bruce where 1=2;
表已创建。
SQL> insert into bruce5 select * from bruce;
已创建83324928行。
已用时间: 00: 09: 06.82
SQL> commit;
提交完成。
SQL>
SQL> select segment_name,bytes/1024/1024/1024 from user_segments;
SEGMENT_NAME BYTES/1024/1024/1024
-------------------- --------------------
BRUCE 8.875
BRUCE1 8.9375
BRUCE2 8.88769531
BRUCE3 8.88317871
BRUCE4 8.88317871
BRUCE5 8.875
SQL> create table bruce6 as select * from bruce where 1=2;
表已创建。
SQL> insert /*+nologging*/ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 10: 17.63
SQL> commit;
提交完成。
SQL> truncate table bruce6;
表被截断。
已用时间: 00: 00: 00.64
SQL> insert /*+append nologging*/ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 08: 07.45
SQL> commit;
提交完成。
SQL> alter table bruce6 nologging;
表已更改。
已用时间: 00: 00: 00.03
SQL> select table_name,logging from user_tables where table_name='BRUCE6';
TABLE_NAME LOGGIN
------------------------------------------------------------ ------
BRUCE6 NO
SQL> insert /*+ append */ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 02: 46.54
SQL> commit;
提交完成。
已用时间: 00: 00: 00.06
SQL> truncate table bruce6;
表被截断。
已用时间: 00: 00: 00.29
SQL> insert into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 09: 47.17
SQL> commit;
提交完成。
已用时间: 00: 00: 00.00
SQL> truncate table bruce6;
表被截断。
已用时间: 00: 00: 00.53
SQL> select logging from user_tables where table_name='BRUCE6';
LOGGIN
------
NO
已用时间: 00: 00: 00.03
SQL> insert /*+ append parallel(bruce6 2) */ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 02: 49.58
SQL> commit;
提交完成。
已用时间: 00: 00: 00.06
SQL> truncate table bruce6;
表被截断。
已用时间: 00: 00: 00.26
已用时间: 00: 00: 00.00
SQL> alter session enable parallel dml;
会话已更改。
已用时间: 00: 00: 00.01
SQL> insert /*+ append parallel(bruce6 2) */ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 05: 03.96
SQL> commit;
提交完成。
已用时间: 00: 00: 00.03
SQL> alter table bruce6 parallel 2;
表已更改。
已用时间: 00: 00: 00.00
SQL>
SQL> select logging,degree from user_tables where table_name='BRUCE6';
LOGGIN DEGREE
------ --------------------------------------------------------------------------------
NO 2
已用时间: 00: 00: 00.01
SQL> ALTER SESSION ENABLE PARALLEL DML;
会话已更改。
已用时间: 00: 00: 00.00
SQL> insert /*+ append */ into bruce6 select * from bruce;
已创建83324928行。
已用时间: 00: 02: 46.48
SQL> COMmit;
提交完成。
已用时间: 00: 00: 00.01
---------------------------------------------------------------------
table是logging | 普通情况 | 09: 06.82
table是logging | /*+append nologging*/ | 08: 07.45
table是nologging | /*+append*/ | 02: 46.54
table是nologging | 无hint | 09: 47.17
table是nologging + parallel | /*+ append parallel(bruce6 2) */ | 05: 03.96 时间更长,会使用temp表空间的数据
table是nologging + parallel | /*+ append */ | 02: 46.48
(1) alter table nologging + append(direct insert) 可以大幅提高insert数据
(2) alter table nologging + append(direct insert) + parallel 没有 (1)的情况好,但是比普通insert的数据块
SQL> select logging,degree from user_tables where table_name='BRUCE6';
LOGGIN DEGREE
--------------------------------------------------------------------------------
NO 2
SQL> alter session enable parallel dml;
会话已更改。
已用时间: 00: 00: 00.00
SQL> insert /*+ append */ into bruce6 select /*+parallel(bruce 2)*/ * from bruce
2 ;
已创建83324928行。
已用时间: 00: 00: 58.06
SQL> select logging,degree from user_tables where table_name='BRUCE7';
LOGGIN DEGREE
------ --------------------------------------------------------------------------------
YES 1
SQL> select logging,degree from user_tables where table_name='BRUCE7';
LOGGIN DEGREE
------ --------------------------------------------------------------------------------
NO 1
已用时间: 00: 00: 00.01
SQL> insert /*+ append */ into bruce7 select /*+parallel(bruce 2)*/ * from bruce;
已创建83324928行。
已用时间: 00: 01: 02.75
SQL> commit;
提交完成。
已用时间: 00: 00: 00.07
在后面的select中加上/*+parallel(bruce 2)*/ 还是可以加快速度的.
通过上面的实验 insert 大量的数据的时候,通过以下几个方面可以加快数据
(1) alter table xxxx nologging
(2) alter table xxxx parallel n;
(3) insert后面的select 中加上/*+parallel (xxxx n)*/ 的hint可以加快速度
(4) 执行insert之前记得 alter session enable parallel dml;
(5) 执行完成之后,切记将 table的logging和degree属性改回来
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24237320/viewspace-2126967/
,如需转载,请注明出处,否则将追究法律责任。