(非归档模式下)创建表T01:

SQL> create table t01 as select * from dba_objects where 1=2;

Table created.

(非归档模式下)查看当前redo大小:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

49784

(非归档模式下)普通INSERT语句插入:

SQL> insert into t01 select * from dba_objects;

11698 rows created.

(非归档模式下)查看普通INSERT语句执行后,当前redo大小:

SQL> select value

from v$mystat,v$statname

2 3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size';

VALUE

----------

1305724

(非归档模式)采用HINT /*+ append*/执行INSERT语句:

SQL> insert /*+ append */ into t01 select * from dba_objects;

11698 rows created.

(非归档模式)查询带/*+ append*/的INSERT执行后,当前redo大小:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size';

VALUE

----------

1308140

(非归档模式)计算使用HINT(/*+ append*/)和普通INSERT语句分别产生的redo大小:

SQL> select (1308140-1305724) redo_append,(1305724-49784) redo from dual;

REDO_APPEND REDO

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

2416 1255940

可见,在非归档模式下,INSERT语句采用HINT /*+ APPEND*/的方式确实比普通INSERT语句产生的redo要少很多。

=========================================

下面测试归档模式下

SQL> archive log list

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/arch

Oldest online log sequence 109

Next log sequence to archive 111

Current log sequence 111

(归档模式)查看当前redo大小:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

19540

(归档模式)执行普通INSERT语句:

SQL> insert into t01 select * from dba_objects;

11698 rows created.

(归档模式)普通INSERT方式产生的redo大小:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

1218884

(归档模式)采用HINT /*+ append*/执行INSERT语句:

SQL> insert /*+ append */ into t01 select * from dba_objects;

11698 rows created.

(归档模式)查询带/*+ append*/的INSERT执行后,当前redo大小:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size';

VALUE

----------

2451664

(归档模式)计算使用HINT(/*+ append*/)和普通INSERT语句分别产生的redo大小:

SQL> select (2451664-1218884) redo_append,(1218884-19540) from dual;

REDO_APPEND (1218884-19540)

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

1232780 1199344

可见,在归档模式下,采用HINT与普通INSERT方式产生的redo量是相当的,且略大于普通INSERT语句产生的redo量。

=========================================

再看一种情况,归档模式,T01也是LOGGING模式

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

2541780

SQL> insert /*+ append nologging */ into t01 select * from dba_objects;

或者执行:

SQL> insert /*+ append */ into t01 nologging select * from dba_objects;

也将产生redo的量为:1233040。

=========================================

最后一种情况:

(归档模式)修改T01的属性为NOLOGGING:

SQL> alter table t01 nologging;

Table altered.

SQL> select table_name,logging from dba_tables where table_name='T01';

TABLE_NAME LOG

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

T01 NO

(归档模式)查看当前redo值:

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

5010600

(归档模式)执行普通INSERT语句:

SQL> insert into t01 select * from dba_objects;

11698 rows created.

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

6209848

(归档模式)采用HINT /*+ append*/执行INSERT语句:

SQL> insert /*+ append */ into t01 select * from dba_objects;

11698 rows created.

SQL> select value

2 from v$mystat,v$statname

3 where v$mystat.statistic#=v$statname.statistic#

4 and v$statname.name='redo size'

5 /

VALUE

----------

6210536

(归档模式)计算两者产生的redo差值:

SQL> select (6210536-6209848) redo_append,(6209848-5010600) redo from dual;

REDO_APPEND REDO

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

688 1199248

可见,在归档模式下,将表调整为NOLOGGING,产生的redo量是最少的!

对比一下:

非归档,T01(LOGGING),普通INSERT语句产生的redo值:1255940

非归档,T01(LOGGING),HINT /*+append*/,产生的redo值:2416

归档,T01(LOGGING),普通INSERT语句产生的redo值:1199344

归档,T01(LOGGING), HINT /*+ append*/,产生的redo值:1232780

归档,T01(LOGGING),/*+append*/ + nologging,产生的redo值:1233040

归档,T01(NOLOGGING),普通INSERT语句产生的redo值:688

归档,T01(NOLOGGING),HINT /*+append*/,产生的redo值:1199248

综合以上的数据,可以明白,如果想INSERT语句执行的更快,产生更少的redo,分两种情况:

非归档模式:

1、在INSERT语句中使用HINT /*+ append */或者使用HINT /*+ append nologging */两者插入数据的速度相同,但是后者产生的日志要少10倍左右

2、insert /*+ append */堆数据时,要排队,其它同样加了append的session只能等待,所以要小心使用。

归档模式:

1、将目标表修改为NOLOGGING(alter table xxx nologging),然后在INSERT语句中使用HINT /*+ append */.或者HINT /*+ append nologging */

2、append在没有使用nologging的情况下,并不会减少归档日志的产生。

3、将表改为nologging属性的情况下插入数据,几乎不会产生归档日志,但前提是必须要使用append参数,否则产生依然会产生归档日志,只不过表在创建时不会产生归档。

关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用的更多相关文章

  1. 一个简单insert 语句执行 40ms 原因剖析

    背景:一个简单的带有主键的insert 语句,居然要 40ms ,开发受不了,要求降低 因此我们要关注的的 数据从插入落地的IO 中间都干了什么 一.MySQL的文件 首先简单介绍一下MySQL的数据 ...

  2. 查看Sql语句执行速度

    原文链接:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.htmlMS_SQL模糊查询like和charindex的对比 lik ...

  3. 测试sql语句执行速度

    DBCC DROPCLEANBUFFERS --清除缓冲区 DBCC FREEPROCCACHE --删除计划高速缓存中的元素 SET STATISTICS io ON SET STATISTICS ...

  4. 40 | insert语句的锁为什么这么多?

    在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁. 因此,insert 语句是一个很轻量的操作.不过,这个结论对于“普通的 insert 语句”才有 ...

  5. 40 insert语句的锁

    40 insert语句的锁 上一篇文章中对mysql自增主键锁做了优化,尽量在申请到自增id后,就释放自增锁. 因此,insert语句是一个很轻量的操作,不过,这个结论对于”普通的insert”才生效 ...

  6. Python批量执行oracle中的insert语句

    从oracle导出一个表的数据,导出的格式是insert语句,数据量30万. 直接在PL/SQL Developer中执行,速度非常慢,脚本中也是100条数据提交一次.因为需要的时间太长,每次中断后, ...

  7. PL/SQL客户端中执行insert语句,插入中文乱码

    问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual;    结果为AMERICAN_ ...

  8. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析

    oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...

  9. PHP执行insert语句报错“Data too long for column”解决办法

    PHP执行mysql 插入语句, insert语句在Navicat for mysql(或任意的mysql管理工具) 中可以正确执行,但是用mysql_query()函数执行却报错. 错误 : “Da ...

随机推荐

  1. multipart/form-data提交

    pip install requests-toolbelt from requests_toolbelt import MultipartEncoder import requests m = Mul ...

  2. HTTPS加密原理与过程

    HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...

  3. Ajax跳入error的原因

    1. dataType错误 我遇到的就是这个dataType错误,即后台返回的dataType类型与前台写的不一致,一般前台写json没问题,大部分是后台返回的类型对不上 2. async请求同步异步 ...

  4. laraveladmin省市区三级联动

    Distpicker是一个中国省市区三级联动选择组件,这个包是基于Distpicker的laravel-admin扩展,用来将Distpicker集成进laravel-admin的表单中 安装 com ...

  5. LaunchScreen 设置启动图片出现的问题

    更换启动图片的时候出现了一系列的小问题,让人头疼,怀疑人生. 1.更换了图片,显示还是老的图片!  -->重启手机,clean Xcode 2.设置布局的时候,请务必要这么布局,很完美! 如果你 ...

  6. SOA架构及其架构分析

    一.什么是SOA SOA即面向服务的架构.分为三层结构:表示层(服务层).中间业务逻辑层.数据访问层. SOA是一种粗粒度.松耦合服务架构,服务之间通过简单.精确定义接口进行通讯,不涉及底层编程接口和 ...

  7. pyqt5--QTDesigner--安装与配置

    安装: 安装PyQt5-tools 文件--->设置---> ---> 安装之后在 安装目录\Lib\site-packages\pyqt5_tools  找到 designer.e ...

  8. Python:查看解释器的位置

    以前学Python时,有时出现这样的情况:明明记得装了scipy包,怎么打import scipy报错说我没这个包? 问题出在,你的电脑上安装了不止一个Python... 而每安装一个包,仅仅在这个P ...

  9. Mybatis-Plus和Mybatis的区别

    1.List item 区别一如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂.通俗来讲——MyBatis:一种操作数据库的框架,提供一种Mapper类,支持 ...

  10. 【javascript】生成二维码

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 < ...