direct-path插入方式提升性能的分析
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插入方式提升性能的分析的更多相关文章
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
- ArrayList和LinkedList遍历方式及性能对比分析
ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayLis ...
- Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]
Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...
- Oracle 11g全表扫描以Direct Path Read方式执行
在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)
原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...
- 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析
原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...
- (转)ArrayList和LinkedList的几种循环遍历方式及性能对比分析
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
- Java 字符串拼接四种方式的性能比较分析
一.简单介绍 编写代码过程中,使用"+"和"contact"比较普遍,但是它们都不能满足大数据量的处理,一般情况下有一下四种方法处理字符串拼接,如下: 1. 加 ...
随机推荐
- Akka(10): 分布式运算:集群-Cluster
Akka-Cluster可以在一部物理机或一组网络连接的服务器上搭建部署.用Akka开发同一版本的分布式程序可以在任何硬件环境中运行,这样我们就可以确定以Akka分布式程序作为标准的编程方式了. 在上 ...
- 怀念Galois
我的第一篇谈到具体学科的博客,还是献给我最钟爱的数学. 个人比较喜欢离散数学,并非因为曲高和寡,而是因为数学分析.概率论.拓扑学.泛函之类的高手实在太多.而离散数学更为抽象,抽象到抽象代数直接以抽象二 ...
- js脚本中try与cache捕获异常处理
<script type="text/javascript"> function add_reason(elm){ try{ var pp=$('.pp').val() ...
- abelkhan编译文档
abelkhan github:https://github.com/qianqians/abelkhan abelkhan编译文档 在编译abelkhan之前,需要先编译第三方库boost.libb ...
- [leetcode-560-Subarray Sum Equals K]
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- USACO Dynamic Programming (1)
首先看一下题目: Introduction Dynamic programming is a confusing name for a programming technique that drama ...
- EJB系列 - EJB高级概念
本人博客文章网址:https://www.peretang.com/ejb-advanced-concepts/ EJB内幕 幕后的EJB:容器会为每一个bean实例自动生成称为EJB对象的代理, 由 ...
- 【hibernate初探】之接口说明,session使用
hibernate作为一个完整的ORM映射框架,通过配置即可以让我们从复杂的JDBC操作中脱离出来.hibernate封装了 JDBC,JTA(java transaction API) 和JNDI. ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- C#常用8种排序算法实现以及原理简介
public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...