insert /*+ APPEND */
总结得出以下3点结论:
a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。
b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。
c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。
数据库版本:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
网上说测试时不要使用auto trace来查看redo size,这个值是有偏差的.建议建立一个视图:
SQL> create or replace view redo_size
2 as
3 select value
4 from v$mystat, v$statname
5 where v$mystat.statistic# = v$statname.statistic#
6 and v$statname.name = 'redo size';
视图已创建。
一、非归档模式
SQL> archive log list
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 95
当前日志序列 97
1、nologging表
SQL> create table test1 nologging as select * from dba_objects where 1=0;
表已创建。
SQL> select * from redo_size;
VALUE
----------
25714940
SQL> insert into test1 select * from dba_objects;
已创建72753行。
SQL> select * from redo_size;
VALUE
----------
34216916
SQL> insert /*+ APPEND */ into test1 select * from dba_objects;
已创建72753行。
SQL> select * from redo_size;
VALUE
----------
34231736
SQL> select (34231736-34216916) redo_append , (34216916-25714940) redo_normal from dual;
REDO_APPEND REDO_NORMAL
----------- -----------
14820 8501976
2、logging表:
SQL> create table test2 as select * from dba_objects where 1=0;
表已创建。
SQL> select * from redo_size;
VALUE
----------
34273348
SQL> insert into test2 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
42775336
SQL> insert /*+ APPEND */ into test2 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
42790156
SQL> select (42790156-42775336) redo_append , (42775336-34273348) redo_normal from dual;
REDO_APPEND REDO_NORMAL
----------- -----------
14820 8501988
二、归档模式下:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount
ORACLE例程已经启动。
Total System Global Area 477073408 bytes
Fixed Size 1337324 bytes
Variable Size 293603348 bytes
Database Buffers 176160768 bytes
Redo Buffers 5971968 bytes
数据库装载完毕。
SQL> alter database archivelog;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 95
下一个存档日志序列 97
当前日志序列 97
1、nologging表
SQL> select * from redo_size;
VALUE
----------
17936
SQL> insert into test1 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
8490972
SQL> insert /*+ APPEND */ into test1 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
8506164
SQL> select (8506164-8490972) redo_append , (8490972-17936) redo_normal from dual;
REDO_APPEND REDO_NORMAL
----------- -----------
15192 8473036
2、logging表
SQL> select * from redo_size;
VALUE
----------
8506780
SQL> insert into test2 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
16979516
SQL> insert /*+ APPEND */ into test2 select * from dba_objects;
已创建72754行。
SQL> select * from redo_size;
VALUE
----------
25518172
SQL> select (25518172-16979516) redo_append , (16979516-8506780) redo_normal from dual;
REDO_APPEND REDO_NORMAL
----------- -----------
8538656 8472736
在归档模式下,对于常规表的insert append产生和insert同样的redo
此时的insert append实际上并不会有性能提高.
但是此时的append是生效了的。
三、insert /*+ append */会阻塞除select以外的DML语句,direct-path insert操作是单独一个事务。
SQL> select count(*) from test2;
COUNT(*)
----------
291016
SQL> insert into test2 select * from dba_objects;
已创建72754行。
SQL> select count(*) from test2;
COUNT(*)
----------
363770
SQL> insert /*+ APPEND */ into test2 select * from dba_objects;
已创建72754行
同一个session下:
SQL> select count(*) from test2;
select count(*) from test2
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> commit;
提交完成。
SQL> select count(*) from test2;
COUNT(*)
----------
436524
SQL> insert /*+ APPEND */ into test2 select * from dba_objects;
已创建72754行。
SQL> shutdown immediate
ORA-01097: 无法在事务处理过程中关闭 - 请首先提交或回退
SQL> select * from v$mystat where rownum<2;
SID STATISTIC# VALUE
---------- ---------- ----------
224 0 1
SQL> select KADDR,TYPE,LMODE from v$lock where sid=224;
KADDR TY LMODE
---------------- -- ----------
0000000071BAE180 TM 6
0000000070CB11B8 TX 6
另外开启一个会话,就会发现只能select,其他DML全部阻塞。
转载 http://www.cnblogs.com/wbzhao/archive/2012/04/01/2429067.html
insert /*+ APPEND */相关推荐
- oracle数据库 append,oracle中insert,copy,insert append执行对比
oracle中insert,copy,insert append执行对比 还是由于迁移数据库,测试了insert,copy,insert append的执行速度. 环境:oracle9i向oracle ...
- oracle中并行与append,如何让insert /*+ append */ 采用并行。
SQL> explain plan for insert /*+ append parallel(my 2) */ into my select * from ac01; 已解释. 已用时间: ...
- Oracle NoLogging Append 方式减少批量insert的redo_size
业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下: [转] 常见dml.ddl语句使用nologging选项所生成 ...
- oracle appen,Oracle中关于insert中使用/*+append*/和nologging的总结
关于Nologging和append,一直存在很多误解,经过一系列研究,终于发现了Nologging的真相, 我们来看一下: 1.对于logging 的table处理 a.非归档模式下: SQL> ...
- 【python列表插入函数】append() extend() insert() 三者区别与使用方法
三个列表插入函数 append() extend() insert() append() append()函数是在列表末尾添加元素 append()括号内可以是数字.字符串- a=[1,2] a.ap ...
- 关于加快INSERT语句执行速度和 HINT /*+ append*/及nologging的使用
(非归档模式下)创建表T01: SQL> create table t01 as select * from dba_objects where 1=2; Table created. (非归档 ...
- mysql批量insert数据锁表_批量插入数据产生锁阻塞的问题
我的数据库表没有主键和外键,表上有索引字段, 5个入库线程批量入库操作,为什么会产生锁阻塞现象? 下面是我查到的session 512 阻塞了其他用户. --检查阻塞情况 select a.sid,a ...
- Oracle insert大数据量经验之谈
在很多时候,我们会需要对一个表进行插入大量的数据,并且希望在尽可能短的时间内完成该工作,这里,和大家分享下我平时在做大量数据insert的一些经验. 前提:在做insert数据之前,如果是非生产环境, ...
- oracle /+append/好用吗,ORACLE-insert /*+append*/提高性能
在非归档模式下表设置为nologging用insert /*+append*/速度最快.那为什么快呢,原理是什么?下面我们来一起做一个实验: SQL> create or replace vie ...
最新文章
- C++中的string::compare的使用
- 开通会员配送费反而更高了?美团外卖发致歉声明!
- 在linux下使用ZThread
- DCMTK:存储服务类用户(C-STORE操作)
- jquery之仿京东菜单
- 流水调度问题c语言,基于遗传算法的流水车间调度问题汇总.doc
- 数学知识在计算机专业中的应用,数学建模在计算机专业中的应用
- PowerShell实战1:Ping_Test
- 文件循环读取_一个案例轻松认识Python文件处理提取文件中的数字
- HTML CSS JS(一)
- 排队接水(洛谷-P1223)
- java 多线程压测_java多线程Jmeter压测实现
- mysql 几个外键类型_mysql – 选择每个外键类型的最高记录
- 为什么plsql不显示tns配置_电脑为什么不定时的会卡?电脑卡和哪些硬件配置有关系呢?...
- 【超详细教程】告别证书,图文并茂教你免签名XX,三种方法任你选!超简单...
- wincc安装服务器系统,wincc7.4安装硬件要求
- 打字教程新手篇-指法练习的重要性和注意事项
- 2022最新淘客三合一cms商城优惠券系统搭建教程
- 如何培养小学生数学独立思考能力?
- 英文Assignment写作段落重要性讲解
热门文章
- 使用EHCache需要注意的几个问题(转)
- cannot find -lunwind-x86_64
- Fluent UDF【4】:C语言
- checking size of char… configure: error: cannot compute sizeof (char) 解决方法
- python调用api应用接口_Python接口测试之urllib2库应用
- 关于Linux fontconfig 字体库的坑
- (待完成)qbxt2019.05 总结2 - 数位DP
- [Unity优化]批处理03:静态批处理
- java数组转list(Arrays .asList)
- 关于电商购物车与订单