用直接路径(direct-path)insert提升性能的两种方法
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提升性能的两种方法的更多相关文章
- 提升PHP性能的21种方法
提升PHP性能的21种方法. 1.用单引号来包含字符串要比双引号来包含字符串更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会.2.如果能将类的方法定义成static,就尽量定义成st ...
- 提高HTML5 canvas性能的几种方法
简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...
- 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧
性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...
- 48-设置tomcat虚拟路径的两种方法(Eclipse、tomcat、IDEA)
设置tomcat虚拟路径的两种方法(Eclipse.tomcat.IDEA) 三种方式设置虚拟服务器路径如果我们要实现一个上传文件的功能,但是又想要上传的文件不会随着自己web服务器的重启而不能访问了 ...
- select into from和insert into select from两种表复制语句区别
select into from和insert into select from两种表复制语句都是将源表source_table的记录插入到目标表target_table,但两句又有区别. 第一句(s ...
- Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack
一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...
- idea设置tomcat虚拟路径的两种方法
1.使用tomcat自己的虚拟路径 1.1.在tomcat\config\server.xml中配置 path="/upload" 虚拟路径 E:\photo\upload 图片存 ...
- C 程序提升效率的10种方法
本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1). 1. 避免不必要的函数调用 考虑下面的2个函数: void s ...
- tp5 提升性能的几个方法
原文:http://www.upwqy.com/details/27.html 首先说明 如果是linux 或者是Mac,需要给予权限才能操作 以下方法建议,在网站稳定后再生成上传. 1 生成路由缓存 ...
随机推荐
- 如何关闭emacs开启时自己打开的欢迎界面
EMACS在开启后,会自动打开一个欢迎界面.如果要去除他,可以在用emacs或其实编辑工具编辑~/.emacs文件. 在最下面一行加上,保存退出即可. (setq inhibit-startup-me ...
- ionic的tabs
<ion-tabs class="tabs-icon-top/bottom(决定这个tabs是置于上面还是底部) tabs-color-active-positive(图标与字体色) ...
- iOS 9正式版开始推送 升级机型非常广泛
北京时间今日零时,苹果正式推送了iOS9,对于iPhone和iPad来说这一版系统升级都有很多重要改进,而升级的机型也非常宽泛,甚至连2011年的iPad 2与iPhone 4s都获得了支持,所以广大 ...
- 灰色蓝色系简洁自适应登录HTML页面
自己写了一个简介的登录页面,页面背景为灰色,居中为登录框,登录面板为半透明效果,整体十分美观,登录按钮有JS效果.自己感觉还不错,拿出来分享一下. 页面效果图 源码下载链接:http://files. ...
- Codeforces Round #168 (Div. 2)
A. Lights Out 模拟. B. Convex Shape 考虑每个黑色格子作为起点,拐弯次数为0的格子构成十字形,拐弯1次的则是从这些格子出发直走达到的点,显然需要遍历到所有黑色黑色格子. ...
- get_headers()函数
get_headers() 是PHP系统级函数,他返回一个包含有服务器响应一个 HTTP 请求所发送的标头的数组.如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息(可用来判断 ...
- oracle rman恢复数据库 方式恢复到异地数据库
目的:从某个环境中,获取相关文件,放到异地机器使用rman 恢复. 情况说明:XX系统使用的是oracle数据库,现已从服务器拉下来相关文件,依靠这些文件来早本地的测试机上恢复数据库,方便进行数据 ...
- C#序列化与反序列化方式简单总结
序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...
- Quartz2D之绘制一个简单的机器猫
学习iOS有一段时间了,在博客园也默默的潜水了两个月,见识了很多大神,收获不少. 今天整理笔记,发现忘记的不少,我感觉需要及时的整理一下了,同时也把做的小东西贴上来和大家分享一下. 最近学习了Quar ...
- [课程设计]Scrum 1.7 多鱼点餐系统开发进度
[课程设计]Scrum 1.7 多鱼点餐系统开发进度(点餐菜式内容添加及美化) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题 ...