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.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的效果。

总之,要想达到不写redo与undo的效果,需要通过修改表或修改索引或修改表空间的nologging模式来处理。

用法如下:

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;

一般实际操作,不用另外指定表名: insert  /* +PARALLEL(8)*/  into table_new select * from table_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_directpath nologgingselect * 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

除此外,还需注意,采用direct—path直接路径插入会在表段 的高水位线上的空白数据块写数据,每次增长至少5个数据块来存放数据,容易造成空间浪费。append /parallel插入会导致 表被锁定 可能阻塞其他DML操作,只适用于表的批量初始化。并行数一般为2的n次方效果更好。

direct-path插入方式提升性能的分析的更多相关文章

  1. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  2. ArrayList和LinkedList遍历方式及性能对比分析

    ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayLis ...

  3. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

  4. Oracle 11g全表扫描以Direct Path Read方式执行

    在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  6. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)

    原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...

  7. 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...

  8. (转)ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  9. Java 字符串拼接四种方式的性能比较分析

    一.简单介绍 编写代码过程中,使用"+"和"contact"比较普遍,但是它们都不能满足大数据量的处理,一般情况下有一下四种方法处理字符串拼接,如下: 1. 加 ...

随机推荐

  1. 大话Python正则表达式

    python的正则表达式模块re import re match_object=re.compile(r"") result=re.match(match_object," ...

  2. 基于两种架构的ETL实现及ETL工具选型策略

    企业信息化建设过程中,业务系统各自为政.相互独立造成的"数据孤岛"现象尤为普遍,业务不集成.流程不互通.数据不共享--.这给企业进行数据的分析利用.报表开发等带来了巨大困难.在此情 ...

  3. SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

    (一)为什么选择7z              7z 是一种主流高效的压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.该格式最初被7-Zip实现并采 ...

  4. 真机调试方法- IOS/Android移动设备

    真机调试 调试安卓 方法一 开启手机的USB调试 安装运行项目 使用chrome步骤如下图 打开开发者工具 打开设备管理 选择设备进行debug 方法二: 直接在地址栏输入chrome://inspe ...

  5. WPF:动态显示或隐藏Listview的某一列

    这几天做项目,需要做个listview满足能够动态显示或隐藏某些列,由于自己是菜鸟水平,查了两天资料也没有想出解决办法.就在我山穷水尽的时候看到了Mgen的一篇博客,给了我很大启发,所以我也决定把自己 ...

  6. MySQL数据库Raid存储方案

    作为一名DBA,选择自己的数据存储在什么上面,应该是最基本的事情了.但是很多DBA却容易忽略了这一点,我就是其中一个.之前对raid了解的并不多,本文就记录下学习的raid相关知识. 一.RAID的基 ...

  7. 也谈TDD,以及三层架构、设计模式、ORM……:没有免费的午餐

    想在园子里写点东西已经很久了,但一直没有落笔,忙着做 一起帮 的开发直播,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因是: 太特么的难写了! 但再难写也要写啊,要等到“能写好了 ...

  8. 解决java.lang.NumberFormatException: For input string: "id"

    今天,项目突然报"java.lang.NumberFormatException:For input string:"id"",项目框架是spring,spri ...

  9. 基于JAX-WS的WebService实现

    JAX-WS是一套Java用于开发XML Web Services的技术规范,它的实现一般有CXF.AXIS和JDK(version>=1.6),借助这些我们可以进行SOAP服务开发. CXF和 ...

  10. vsftpd配置虚拟用户

    #安装vsftpd yum -y install vsftpd #创建本地ftp账户 groupadd ftpuser useradd -g ftpuser -s /sbin/nologin ftpu ...