`

append小结

 
阅读更多

Hint:append小结

The APPEND hint lets you enable direct-path INSERT if your database is running in serial mode. Your database is in serial mode if you are not using Enterprise Edition. Conventional INSERT is the default in serial mode, and direct-path INSERT is the default in parallel mode.
In direct-path INSERT, data is appended to the end of the table, rather than using existing spacecurrently allocated to the table. As a result, direct-path INSERT can be considerably faster than
conventional INSERT.

另解(出处遗忘):
使用这个hint可以将数据使用直接路径插入到表的高水线之后,由于是连续的没有使用的空间,所以插入速度快。就是说直接插入,减少了搜索块的时间.

语法:
insert /*+append */ into table …
模拟场景:
step0
create table t1(id number(2) primary key);
create table t2(id number(2));
alter table t2 add foreign key (id) references t1(id);
create table t3(id number(2));
insert into t1 select rownum from dual connect by rownum <= 10;

step1
insert /*+append*/ into t2 select * from t1;
select count(*) from t2;
执行正常;

step2
insert /*+append*/ into t3 select * from t1;
select count(*) from t3;
执行出现异常;
ORA-12838:无法在并行模式下修改之后读或修改对象

上述重现了原来看过一位网友给出的测试结果,他给出的结论是:参照完整性约束使append失效,之前在项目也遇到过该问题的我也一直默记这个结论,但是究竟为什么会失效呢?

Next
灵光一现,决定从锁入手,仔细查了一下oracle锁的种类:
表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update、Lock for update、Lock row share
3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert、Update、Delete、Lock row share
4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

接下来,在执行setp1时,
查看v$locked_object
select t1.OBJECT_ID,t1.SESSION_ID,t1.ORACLE_USERNAME,t1.LOCKED_MODE
from v$locked_object t1;
OBJECT_ID SESSION_ID ORACLE_USERNAME LOCKED_MODE
80798 306 TCS116 3
80796 306 TCS116 2
有点发现了,这里对两个表都加了锁,那么继续刨根:
select t2.object_name,t2.object_id from user_objects t2 where t2.object_id in (80798,80796)
OBJECT_NAME OBJECT_ID
T1 80796
T2 80798

在执行setp2时,执行同样操作(合二为一):
select t1.OBJECT_ID, t2.object_name ,t1.SESSION_ID,t1.ORACLE_USERNAME,t1.LOCKED_MODE
from v$locked_object t1, user_objects t2
where t1.OBJECT_ID = t2.object_id
OBJECT_ID OBJECT_NAME SESSION_ID ORACLE_USERNAME LOCKED_MODE
80799 T3 306 TCS116 6
明显有个object被锁了,而且还是最高级别的锁,所以你就没办法在去查询或者做其他的dml操作了。

至此个人认为应该是有个了较为合理的解释:在有参照完整性约束时append提示符提供ss行级共享锁;否则提供最高级别的排他锁。

Extend:
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo

from:http://www.itpub.net/viewthread.php?tid=1078462


参考下列网站
http://space.itpub.net/?uid-185801-action-viewspace-itemid-936

http://www.itpub.net/viewthread.php?tid=979334

分享到:
评论

相关推荐

    Python 生成一个从0到n个数字的列表4种方法小结

    我就废话不多说了,直接上代码吧! 第一种 def test1(): l = [] for i in range(1000): l = l + [i] 第二种(append ) def test2(): ...以上这篇Python 生成一个从0到n个数字的列表4种方法小结就是小编

    深入浅出Struts2(附源码)

    1.4 小结 13 第2章初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    1.4 小结 13 第2章 初识Struts 14 2.1 Struts的优点 14 2.2 Struts的动作处理流程 15 2.3 拦截器 17 2.4 Struts配置文件 18 2.4.1 struts.xml文件 19 2.4.2 struts.properties文件 26 2.5 Struts应用程序示例 26 ...

    python常用运维脚本实例小结

    一、ps 可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和。 (提示,使用ps aux 列出所有进程,过滤出RSS那列,然后... list.append(new_rss) for i in list[1:-1]: num = int(i) sum =

    python列表的常用操作方法小结

    本文实例为大家了Python中列表(List)的...List.append('allen') #方式一:向list结尾添加 参数object &gt;&gt;&gt; a=[1,2,3,4] &gt;&gt;&gt; a.append(5) &gt;&gt;&gt; print(a) [1, 2, 3, 4, 5] List.insert(4,'lewis') #方式二:插入一个元素

    Python常用列表数据结构小结

    1.list.append(x) 把元素x添加到列表的结尾,相当于a[len(a):] =[x],代码如下: &gt;&gt;&gt; a=[1,2,3,4,5] &gt;&gt;&gt; a [1, 2, 3, 4, 5] &gt;&gt;&gt; a.append(-2) &gt;&gt;&gt; a [1, 2, 3, 4, 5, -2] 2. list.extend(L) 将一个列表中的所有...

    Python列表(list)常用操作方法小结

    list.append(x) 把一个元素添加到链表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = L 。 list.insert(i, x) 在指定位置插入一个元素。...

    js的一些常用方法小结

    Val(),append(),get(),split(),substr(),each(),html(),keyup(),trim(),show(),hide(),indexOf() 一个一个来看: Val():来对一个页面元素进行取值和赋值 取值:var result = $(“#txtSearch”).val(); 赋值:$(“#...

    python 实现目录复制的三种小结

    1.1在此就创建两个栈(或者队列),将原目录和目标目录分别添加到栈(或者队列)里面,一般用append添加,加在栈的顶部,队列的后部 1.2深度遍历 从栈的顶部取出一个原路径去判断,同时用同样的方式取出目标路径(栈和队列都...

    jQuery中setTimeout的几种使用方法小结

    代码如下:”div_debug”&gt; [removed][removed] [removed] functionlog(s){ $(‘#div_debug’).append(s+' ’); } //下文中测试用的代码可以放在这一行注释的下面,替换掉 //… //… [removed] 原生态 java

    Python引用传值概念与用法实例小结

    本文实例讲述了Python引用传值概念与用法。分享给大家供大家参考,具体如下: Python函数的参数传值使用的是引用传值,也... lis.append('hello i am the addone') print lis return lis = [1, 2, 3] ChangeList(lis

    Python程序设计:文件下载去重器(案例).pptx

    步骤:任务小结 任务 文件下载去重器 小结 知识点 掌握集合的概念与创建 掌握集合的常用操作 掌握集合的方法 主要思路 初始化一个集合,用键盘输入要下载的文件名 将下载的文件名添加到集合中 获取文件的数量,并...

    Python3列表内置方法大全及示例代码小结

    append 将单个对象添加至列表末尾 clear 删除列表中所有项目 copy 列表的浅拷贝,参见上篇文章《Python列表赋值,复制,深拷贝以及5种浅拷贝详解》 count 统计指定对象在列表中出现的次数 extend 通过附加...

    jQuery on()绑定动态元素出现的问题小结

    使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件,例如append等。 之前使用 on 的时候一直是 $().on('click','function(){ }') 之后发现有些时候一直无法绑定(比如元素动态生成时),查看文档后发现...

    内存型数据库Redis持久化小结

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式,二是Append-only file(缩写aof)的方式,三是虚拟...

    低清版 大型门户网站是这样炼成的.pdf

    1.5 小结 32 第2章 mvc混血宠儿struts 2 33 2.1 初识mvc新秀struts 2 33 2.1.1 mvc概述 33 .2.1.2 struts 2的mvc实现 35 2.1.3 struts 2的基本组成 36 2.1.4 struts 2的常用类介绍 38 2.1.5 struts 2的业务...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    1.4 小结 19 第2章 锁和阻塞 20 2.1 关于锁 20 2.2 锁和阻塞 22 2.3 引起阻塞的其他情况 30 2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    1.4 小结 19 第2章 锁和阻塞 20 2.1 关于锁 20 2.2 锁和阻塞 22 2.3 引起阻塞的其他情况 30 2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池...

Global site tag (gtag.js) - Google Analytics