1、传统串行insert方式

常见的insert方式有两种:

(1) insert into table_name values(....)

(2) insert into target_table select* from source_table

上面这两种常规的插入式,默认都是在串行方式下的插入,会将insert的数据写入buffer_cache,插入前检查表中是否有block中存有空闲空间可以追加插入,并写入redo log。

2、直接路径(direct-path)insert优点与使用要点

2.1、Direct-path insert 方式的优点

(1) 可以将insert数据跳过buffer_cahce,省掉了buffer block的格式化与DBWR操作,直接从PGA写入磁盘

(2) 不检查表中现有的block是否有空闲空间,直接在表的高水位线(HWM)以上插入

(3) 如果在数据库处于非归档模式下,或者是数据就处于归档模式,表级处于nologging状态下,只有少量的空间信息redo写入、不写入数据undo(因为要回滚时可以直接回退到高水线即可,而不需要针对insert生成delete的回滚记录),所以在特定的情况下,直接路径(direct-path)的insert方式,在性能上远远快于常规的串行插入方式。

2.2、使用direct-path insert需要特别注意的要点

2.2.1 DB非force loggging模式下direct-path insert对redo与undo的写入影响

如果在数据库处于归档模式,以及表处于logging模式下,直接路径(direct-path)性能提升会大打折扣,因为,虽然direct-path能生效,但是仍然会记录下完整的redo和undo。

也就是说,在归档模式下,还需要将表改成nologging模式,才不会写数据的redo。

2.2.2 DB force logging模式下direct-pathinsert对redo的写入影响

Note: If the database or tablespace is in FORCE LOGGING mode, then

direct-path INSERT always logs, regardless of the logging setting.

如果数据库或表空间在forcelogging模式,则direct-path insert总是会写日志,无论logging如何设置。

3、使用直接路径(direct-path)insert的方法

3.1 方法一:使用/*+ APPEND */ hint方式

以下为ORACLE官方技术资料对APPENDhint的说明:

APPEND hint: Instructs the optimizer to use direct-path INSERT (data is appended to the

end of the table, regardless of whether there is free space in blocks below the high

watermark)

3.1.1 数据库非归档模式下使用/*+ APPEND*/ hint方式

当数据库处于非归档模式下,不管表为logging模式还是nologging模式,使用/*+APPEND */ hint,既可以使用direct-path,还将不记录redo和undo

用法如下:

INSERT /*+ APPEND */ INTO new_object SELECT * FROM dba_objects;

3.1.2 数据库处于归模模式下使用/*+APPEND */ hint方式

当数据库处于归模模式下,若表为logging模式,即便使用/*+APPEND */ hint,虽然direct-path可以起到作用,但是insert操作仍然会写redo记录,就算你在insert语句上加nologging也不会有效果,redo日志与undo照写不误。

需要通修改表或修改索引,或修改表空间的no-logging模式来达到不写redo与undo的效果

以下为从metalink(文档ID166727.1)中找到的技术资料:

The APPEND hint is required for using serial direct-load INSERT.

Direct-load INSERT operations can be done without logging of redo

information in case the database is in ARCHIVELOG mode.

Redo information generation is suppressed by setting no-logging

mode for the table, partition, or index into which data will be

inserted by using an ALTER TABLE, ALTER INDEX, or ALTER TABLESPACE

command.

用法如下:

Alter table new_object nologging;

INSERT /*+ APPEND */ INTO new_object SELECT * FROM dba_objects;

3.2 方法二:DML并行模式的方式

DML并行模式下,direct-path插入方式是默认的,当然,在DML并行模式下如果想不使用direct-path插入,可以通过加noappendhint实现。以下是DML并行模式下的direct-path插入:

并行DML的前提条件:

(1)ORACLE版本为Oracle Enterprise Edition

(2)操作的会话开启并行DML

(3)下面三项要求必须满足一项:

1)目标表上开启并行属性(DEGREE)

2)插入语句中指定并行提示(/*+ parallel n */)

3)有设置PARALLEL_DEGREE_POLICY参数的值为AUTO

以数据库为非归档模式用法为例(注意归档模式,还需将表改成nologging模式):

(1)alter session enable parallel dml;

语句还有选项有::ALTER SESSION { ENABLE | FORCE } PARALLEL DML;

(2)alter table new_object_directpath parallel 8;

(3)insert /*+PARALLEL(new_object_directpath, 8) */into new_object_directpathnologging select * from new_object_old;

4、归档模式下传统串行方式与direct-path方式insert性能对比

环境说明:

源表名

test_dba_objects

源表行数

1630104

源表segment大小

184MB

操作步骤与性能对比结果如下:

传统串行insert方式

APPEND hint的direct-path insert方式

DML并行的direct-path insert方式

(1)建表与修改设定

SQL>create table new_object_directpath as select * from test_dba_objects where 1=2

SQL>alter table new_object_directpath nologging

SQL> SET TIMING ON

Elapsed: 00:00:00.54

(2)insert耗时

SQL> insert into new_object_directpathnologgingselect * from test_dba_objects;

1630104 rows created.

Elapsed: 00:00:12.43

未产生数据redo与undo

(1)建表与修改设定

SQL>create table new_object_directpath as select * from test_dba_objects where 1=2

SQL>alter table new_object_directpath nologging

SQL> SET TIMING ON

Elapsed: 00:00:00.54

(2)insert耗时

SQL> insert /*+APPEND */into new_object_directpath select * from test_dba_objects;

1630104 rows created.

Elapsed: 00:00:05.83

未产生数据redo与undo

SQL>create table new_object_directpath as select * from test_dba_objects where 1=2

SQL>alter table new_object_directpath nologging

SQL> SET TIMING ON

Elapsed: 00:00:00.54

(2)修改表的并行模式

SQL> alter table new_object_directpath parallel 8;

(3) insert耗时

SQL> insert /*+parallel (new_object_directpath,8) */ into new_object_directpath select * from test_dba_objects;

1630104 rows created.

Elapsed: 00:00:05.61

未产生数据redo与undo

http://www.2cto.com/database/201501/369138.html

用直接路径(direct-path)insert提升性能的两种方法的更多相关文章

  1. 提升PHP性能的21种方法

    提升PHP性能的21种方法. 1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会.2.如果能将类的方法定义成static,就尽量定义成st ...

  2. 提高HTML5 canvas性能的几种方法

    简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...

  3. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧

    性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...

  4. 48-设置tomcat虚拟路径的两种方法(Eclipse、tomcat、IDEA)

    设置tomcat虚拟路径的两种方法(Eclipse.tomcat.IDEA) 三种方式设置虚拟服务器路径如果我们要实现一个上传文件的功能,但是又想要上传的文件不会随着自己web服务器的重启而不能访问了 ...

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

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

  6. Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

    一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...

  7. idea设置tomcat虚拟路径的两种方法

    1.使用tomcat自己的虚拟路径 1.1.在tomcat\config\server.xml中配置 path="/upload" 虚拟路径 E:\photo\upload 图片存 ...

  8. C 程序提升效率的10种方法

    本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1).   1. 避免不必要的函数调用 考虑下面的2个函数: void s ...

  9. tp5 提升性能的几个方法

    原文:http://www.upwqy.com/details/27.html 首先说明 如果是linux 或者是Mac,需要给予权限才能操作 以下方法建议,在网站稳定后再生成上传. 1 生成路由缓存 ...

随机推荐

  1. Java笔记8-抽象接口

    高级特性部分: 抽象(abstract) 接口(interface) 提纲: 抽象类的定义和使用 模板设计模式的使用 接口的定义和使用 回调函数 区别抽象类和接口的异同 软件设计原则--------- ...

  2. CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)

    当我们设置我的的div,或者其它文本框固定宽度之后,文本内容过多就会出文本溢出(显示在区域外面,不换行的情况). 这时我们可以使用Css中的几个属于来解.有以下的三个属于可以解决问题: 1,word- ...

  3. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  4. eclipse android sdk content loader一直显示0%的问题解决

    今天上班启动eclipse,发现eclipse 一直卡在android sdk content loader的地方,一直显示为0%.百度后发现很多都是一下解决方法:  关闭Eclipse,删掉Ecli ...

  5. (转)网上总结的 NIPS 201 参会感受

    1. http://www.machinedlearnings.com/2016/12/nips-2016-reflections.html 2. http://blog.arpitmohan.com ...

  6. dhtmlxScheduler日程安排控件

    dhtmlxScheduler是一个JavaScript日程安排控件 官方网站:http://www.dhtmlx.com/在线帮助文档:http://docs.dhtmlx.com/doku.php ...

  7. JSBinding / Testing

    Unity version compatibilities 5.3.5 5.2.0 5.1.5 5.0.4 4.7.2 4.7.0 4.6.9 4.6.0 4.5.5 Platform compati ...

  8. 基于XML的AOP配置-转

    http://www.cnblogs.com/yangy608/archive/2010/11/14/1876839.html AOP(Aspect-Oriented Programming,面向切面 ...

  9. VS2010 中 Entity Framework 多数据库并存方法

    选中相应数据库生成的 *.edmx文件,然后在属性中找到“自定义工具命名空间”,为每个EF数据集设置不同的命名空间,这样每个数据库生成的代码就会被隔离在不同的命名空间,即使同名类型也就不会相互影响了.

  10. MySQL Innodb数据库性能实践——热点数据性能

    摘要: 对于大部分的应用来说,都存在热点数据的访问,即:某些数据在一定时间内的访问频率要远远高于其它数据. 常见的热点数据有“最新的新闻”.“最热门的新闻”.“下载量最大”的电影等. 为了了解MySQ ...