前言

前段时间报表数据库上有条insert sql语句,插入的大量数据,执行非常慢,需要对其进行分析优化。

分析步骤是在:ARCHIVE与NOARCHIVE模式下进行。

测试场景: 分别对表的常规插入表在append插入表在append + parallel插入进行性能测试,得出结果。

环境准备

数据库版本 基础表 nologging表 logging表
Oracle 11g T1 T2 T3
#创建T1,T2,T3表
create table t1 as select * from dba_objects;
create table t2 as select * from dba_objects where 1=2;
create table t3 as select * from dba_objects where 1=2; #往T1表插入数据
SQL> insert into t1 select * from t1; 72813 rows created. SQL> / 145626 rows created. SQL> / 291252 rows created. SQL> select count(*) from t1; COUNT(*)
----------
582504 #设置T2表为nologging属性
SQL> alter table t2 nologging; Table altered.

数据库处于ARCHIVE时

常规插入

nologging 表T2

SQL> insert into t2 select * from t1;
commit;
582824 rows created.
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 582K| 53M| 1455 (2)| 00:00:18 |
| 1 | LOAD TABLE CONVENTIONAL | T2 | | | | |
| 2 | TABLE ACCESS FULL | T1 | 582K| 53M| 1455 (2)| 00:00:18 |
--------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
3345 recursive calls
46879 db block gets
27878 consistent gets
8269 physical reads
67752144 redo size
838 bytes sent via SQL*Net to client
784 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
582824 rows processed SQL>
Commit complete.

耗费:67752144 redo size

logging 表T3

SQL> insert into t3 select * from t1;
commit;
582824 rows created.
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 582K| 53M| 1455 (2)| 00:00:18 |
| 1 | LOAD TABLE CONVENTIONAL | T3 | | | | |
| 2 | TABLE ACCESS FULL | T1 | 582K| 53M| 1455 (2)| 00:00:18 |
--------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
2860 recursive calls
46875 db block gets
27811 consistent gets
1 physical reads
67875992 redo size
829 bytes sent via SQL*Net to client
784 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed SQL>
Commit complete.

耗费:67875992 redo size

append 插入

nologging 表T2

SQL> insert /*+ append */  into t2 select * from t1;
commit;
582824 rows created. Execution Plan
---------------------------------------------------------- ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel SP2-0612: Error generating AUTOTRACE EXPLAIN report Statistics
----------------------------------------------------------
2627 recursive calls
9324 db block gets
8832 consistent gets
0 physical reads
143436 redo size
824 bytes sent via SQL*Net to client
798 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:143436 redo size

logging 表T3

SQL> insert /*+ append */ into t3 select * from t1; 

582824 rows created.

Execution Plan
----------------------------------------------------------
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel SP2-0612: Error generating AUTOTRACE EXPLAIN report Statistics
----------------------------------------------------------
2627 recursive calls
9327 db block gets
8832 consistent gets
0 physical reads
68384900 redo size
822 bytes sent via SQL*Net to client
797 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:68384900 redo size

parallel + append 插入

nologging 表T2

SQL> alter session enable parallel dml;
insert /*+ append parallel(2) */ into t2 select * from t1;
commit;
Session altered. SQL> 582824 rows created. Execution Plan
----------------------------------------------------------
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel SP2-0612: Error generating AUTOTRACE EXPLAIN report Statistics
----------------------------------------------------------
52 recursive calls
32 db block gets
19 consistent gets
0 physical reads
21916 redo size
824 bytes sent via SQL*Net to client
809 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:21916 redo size

logging 表T3

SQL> alter session enable parallel dml;
insert /*+ append parallel(2)*/ into t3 select * from t1;
commit;
Session altered. SQL> 582824 rows created. Execution Plan
----------------------------------------------------------
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel SP2-0612: Error generating AUTOTRACE EXPLAIN report Statistics
----------------------------------------------------------
50 recursive calls
33 db block gets
20 consistent gets
0 physical reads
21308 redo size
824 bytes sent via SQL*Net to client
808 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:21308 redo size

数据库处于NOARCHIVE时

常规插入

nologging 表T2

Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 582K| 53M| 1455 (2)| 00:00:18 |
| 1 | LOAD TABLE CONVENTIONAL | T2 | | | | |
| 2 | TABLE ACCESS FULL | T1 | 582K| 53M| 1455 (2)| 00:00:18 |
--------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
2538 recursive calls
46869 db block gets
27796 consistent gets
8266 physical reads
67754744 redo size
824 bytes sent via SQL*Net to client
784 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:67754744 redo size

logging 表T3

Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013 ---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 582K| 53M| 1455 (2)| 00:00:18 |
| 1 | LOAD TABLE CONVENTIONAL | T3 | | | | |
| 2 | TABLE ACCESS FULL | T1 | 582K| 53M| 1455 (2)| 00:00:18 |
--------------------------------------------------------------------------------- Statistics
----------------------------------------------------------
2593 recursive calls
46873 db block gets
27800 consistent gets
1600 physical reads
67757328 redo size
824 bytes sent via SQL*Net to client
784 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:67757328 redo size

append 插入

nologging 表T2

Statistics
----------------------------------------------------------
2627 recursive calls
9324 db block gets
8832 consistent gets
2993 physical reads
143480 redo size
822 bytes sent via SQL*Net to client
798 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:143480 redo size

logging 表T3

Statistics
----------------------------------------------------------
2627 recursive calls
9327 db block gets
8832 consistent gets
0 physical reads
143420 redo size
821 bytes sent via SQL*Net to client
798 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:143420 redo size

parallel + append 插入

nologging 表T2

Statistics
----------------------------------------------------------
50 recursive calls
32 db block gets
21 consistent gets
0 physical reads
21896 redo size
823 bytes sent via SQL*Net to client
810 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:21896 redo size

logging 表T3

Statistics
----------------------------------------------------------
50 recursive calls
33 db block gets
20 consistent gets
0 physical reads
21896 redo size
821 bytes sent via SQL*Net to client
809 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
582824 rows processed

耗费:21896 redo size

综合比较

属性 表名 常规插入产生的redo size apppend插入产生的redo size apppend + parallel插入产生的redo size
数据库模式 archive
nologing t2 67752144 143436 21916
loging t3 67875992 68384900 21308
数据库模式 noarchive
nologing t2 67754744 143480 21896
loging t3 67757328 143420 21896

1)数据库处于ARCHIVE模式时,对logging表执行append插入,是对性能没有优化的加并行parallel才会有影响。

2)数据库处于NOARCHIVE模式时,对logging表执行append插入,可以有效的提升性能。当然加并行parallel效果会更好

Insert 语句对 nologging 与 logging表 在不同场景下的优化的更多相关文章

  1. oracle带条件的Insert语句

    背景 在一条记录完结时,自动向表中加入一条新的记录,采用的是事务处理,修改现有记录,并新增一条记录,直接采用的insert语句会报错 //主键冲突 unique constraint (XXXXXX) ...

  2. SQL基础语法—insert语句

    1 insert语句 insert语句用于插入数据到表中,其基本语法有以下三种: Syntax: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IG ...

  3. 关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用

    (非归档模式下)创建表T01: SQL> create table t01 as select * from dba_objects where 1=2; Table created. (非归档 ...

  4. SQLServer将表数据导出为Insert语句

    从网上找到的方法,不过很不错,记录下来,也算是分享下~~ 有一个表,city,有列:cityID,cityName;将此表中所有数据,变为insert语句 select 'insert into ta ...

  5. 取得表中数据的insert语句

    Build Insert Statements for the Existing Data in Tables 下面这个脚本实现了取得一个非空表中的所有insert语句 This script bui ...

  6. 【SQL Sever】将SQL Sever中的一个数据表的数据导出为insert语句

    例如:这SQL   Sever中的一张数据表,想要将这张数据表中的数据  转化成一个一个的insert语句存储在txt的文档中,那么不论走到那里这个insert语句一执行,我们就能将这个数据表中的数据 ...

  7. 使用C#导出MSSQL表数据Insert语句,支持所有MSSQL列属性

    在正文开始之前,我们先看一下MSSQL的两张系统表sys.objects . syscolumnsMSDN中 sys.objects表的定义:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均 ...

  8. select into from和insert into select from两种表复制语句区别

    select into from和insert into select from两种表复制语句都是将源表source_table的记录插入到目标表target_table,但两句又有区别. 第一句(s ...

  9. 表数据转换为insert语句

    /* 对象:导出物理表数据为Insert语句 描述:可以传递条件精确导出sql 加条件的前提是只知道相应的字段名及类型 */ from sysobjects where name ='proc_ins ...

随机推荐

  1. bzoj 3612: [Heoi2014]平衡【整数划分dp】

    其实就是-n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551 ...

  2. Word Cloud (词云) - Python

    >>What's Word Cloud 词云 (Word Cloud)是对文本中出现频率较高的词语给予视觉化展示的图形, 是一种常见的文本挖掘的方法.目前已有多种数据分析工具支持这种图形, ...

  3. Go语言多态

    总结一下Go语言中多态 package main import "fmt" //申明一个函数类型 type FuncMs func(int ,int) int //加法 func ...

  4. vultr 购买vps

    基本安装转自:https://github.com/uxh/shadowsocks_bash/wiki/Vultr%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B 连接 Vul ...

  5. php实现rpc简单的方法

    rpc是啥这不多解释,php扩展实现rpc yar是鸟哥的写的扩展,实现简单的rpc.比较很好理解 windows安装yar http://pecl.php.net/package/yar/2.0.4 ...

  6. 【杂谈】RN的一点回顾与未来的展望

    从开始到现在,笔者接触RN已经接近半年,适逢各种变化的发生,于是,简单的遐想了一下RN的未来. Airbnb在今年早些时候,宣布了放弃继续使用RN,并且发布了一篇“React Native at Ai ...

  7. [POI2011]Temperature

    Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The mea ...

  8. Stamps ans Envelope Sive UVA - 242

    ( ||{集合x}表示x中元素1||x中元素2||...||x的最后一个元素||(a,b)表示a||b) ans[i][j][k]表示考虑前i种邮票时取j个邮票能否得到面值kans[i][j][k]= ...

  9. java数组实现买彩票(通过标识符进行判断的思想)

    package com.wh.shuzu; import java.util.Random; import java.util.Scanner; /** * 买彩票 * @author 王拥江同学 * ...

  10. 备份字段(CATALOGUE_CODE)

    update am_e4_entry set CATALOGUE_CODE_back=CATALOGUE_CODE; 还原字段 update am_e4_entry a set CATALOGUE_C ...