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
分享到:
相关推荐
我就废话不多说了,直接上代码吧! 第一种 def test1(): l = [] for i in range(1000): l = l + [i] 第二种(append ) def test2(): ...以上这篇Python 生成一个从0到n个数字的列表4种方法小结就是小编
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应用程序示例...
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 ...
一、ps 可以查看进程的内存占用大小,写一个脚本计算一下所有进程所占用内存大小的和。 (提示,使用ps aux 列出所有进程,过滤出RSS那列,然后... list.append(new_rss) for i in list[1:-1]: num = int(i) sum =
本文实例为大家了Python中列表(List)的...List.append('allen') #方式一:向list结尾添加 参数object >>> a=[1,2,3,4] >>> a.append(5) >>> print(a) [1, 2, 3, 4, 5] List.insert(4,'lewis') #方式二:插入一个元素
1.list.append(x) 把元素x添加到列表的结尾,相当于a[len(a):] =[x],代码如下: >>> a=[1,2,3,4,5] >>> a [1, 2, 3, 4, 5] >>> a.append(-2) >>> a [1, 2, 3, 4, 5, -2] 2. list.extend(L) 将一个列表中的所有...
list.append(x) 把一个元素添加到链表的结尾,相当于 a[len(a):] = [x] 。 list.extend(L) 将一个给定列表中的所有元素都添加到另一个列表中,相当于 a[len(a):] = L 。 list.insert(i, x) 在指定位置插入一个元素。...
Val(),append(),get(),split(),substr(),each(),html(),keyup(),trim(),show(),hide(),indexOf() 一个一个来看: Val():来对一个页面元素进行取值和赋值 取值:var result = $(“#txtSearch”).val(); 赋值:$(“#...
1.1在此就创建两个栈(或者队列),将原目录和目标目录分别添加到栈(或者队列)里面,一般用append添加,加在栈的顶部,队列的后部 1.2深度遍历 从栈的顶部取出一个原路径去判断,同时用同样的方式取出目标路径(栈和队列都...
代码如下:”div_debug”> [removed][removed] [removed] functionlog(s){ $(‘#div_debug’).append(s+' ’); } //下文中测试用的代码可以放在这一行注释的下面,替换掉 //… //… [removed] 原生态 java
本文实例讲述了Python引用传值概念与用法。分享给大家供大家参考,具体如下: Python函数的参数传值使用的是引用传值,也... lis.append('hello i am the addone') print lis return lis = [1, 2, 3] ChangeList(lis
步骤:任务小结 任务 文件下载去重器 小结 知识点 掌握集合的概念与创建 掌握集合的常用操作 掌握集合的方法 主要思路 初始化一个集合,用键盘输入要下载的文件名 将下载的文件名添加到集合中 获取文件的数量,并...
append 将单个对象添加至列表末尾 clear 删除列表中所有项目 copy 列表的浅拷贝,参见上篇文章《Python列表赋值,复制,深拷贝以及5种浅拷贝详解》 count 统计指定对象在列表中出现的次数 extend 通过附加...
使用 on() 方法可以给将来动态创建的动态元素绑定指定的事件,例如append等。 之前使用 on 的时候一直是 $().on('click','function(){ }') 之后发现有些时候一直无法绑定(比如元素动态生成时),查看文档后发现...
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式,二是Append-only file(缩写aof)的方式,三是虚拟...
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的业务...
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 数据缓冲池...
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 数据缓冲池...