ITPub博客

首页 > 数据库 > Oracle > [Oracle] Insert into速度测试nologging+parallel

[Oracle] Insert into速度测试nologging+parallel

原创 Oracle 作者:tolilong 时间:2016-10-23 22:20:56 0 删除 编辑
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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-07-13

  • 博文量
    406
  • 访问量
    1208675