查看: 2475|回复: 1

append小结

[复制链接]
论坛徽章:
45
马上有对象
日期:2014-07-28 22:58:22凯迪拉克
日期:2013-10-01 09:34:09劳斯莱斯
日期:2013-09-23 12:56:01阿斯顿马丁
日期:2013-09-17 18:07:48凯迪拉克
日期:2013-09-12 11:10:25比亚迪
日期:2013-08-23 21:12:02蜘蛛蛋
日期:2013-07-26 20:15:22迷宫蛋
日期:2013-05-14 18:10:23紫蛋头
日期:2013-03-16 10:05:302013年新春福章
日期:2013-02-25 14:51:24
跳转到指定楼层
1#
发表于 2008-10-29 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 space  currently 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
参考下列网站
http://space.itpub.net/?uid-185801-action-viewspace-itemid-936

http://www.itpub.net/viewthread.php?tid=979334
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
2#
发表于 2008-10-30 10:41 | 只看该作者
赞一个

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表