Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1025564
  • 博文数量: 171
  • 博客积分: 55
  • 博客等级: 民兵
  • 技术积分: 2077
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 10:11
个人简介

pugna

文章分类

全部博文(171)

文章存档

2021年(4)

2020年(1)

2019年(4)

2018年(5)

2017年(7)

2016年(9)

2015年(36)

2014年(8)

2013年(96)

2012年(1)

分类: Oracle

2015-02-10 14:23:59

Oracle里面的写入数据方式分为2种,一个是传统方式写入(conventional insert),另外一个是直接路径写入(direct path insert)。

            传统方式写入: Oracle会重用表里面空闲空间,并且写入会先写入到buffer cache。

            直接路径写入:Oracle不重用表里面的空闲 空间,直接写入到新分配的块,并且数据直接写入到data file,不写入到buffer cache。效率更高。如果表的并行度不为1,那么直接路径写入是默认的写入行为(需要开启会话并行dml)。直接路径写入为元数据(例如空间扩展引起的 数据字典数据变化)变更产生REDO, UNDO。而数据变更,redo,undo生成情况如下:

?  不为数据写入生成undo

?  如果数据库为非归档或者没有开启force logging,那么直接路径写入时,不为数据写入产生redo,这时与表是否设置nologging属性无关。

?  如果数据库为归档,但是没有开启force logging,logging的表会产生redo,nologging的表不会产生redo。

?  如果数据库为归档并且开启了force logging,数据写入会产生redo,无论是否设置logging,nologging。

            

            直接路径写入的一些限制:

?  在一个事务里面,可以执行多次直接路径写入,一旦该事物并行修改了表,分区或者索引,当前会话将无法再次方位该对象。例如会话A在表T上进行直接路径写入 后,会话A无法再次访问表T,但是会话B可以查询表T,此时如果会话A执行一个传统路径写入,会被阻塞,等待事件为:enq: TM – contention。

?  目标表不能是cluster,不能含有object类型字段,不能含有外键约束,触发器。

? 对于目标表是IOT表,也有一些限制。

?  分布式写入无法进行直接路径写入。

 

APPEND,PARALLE和直接路径写入关系:

                Append默认也是采用直接路径写入,不要求session enable parallel。

                Parallel 要求会话级别enable parallel,否则将无法进行直接路径写入。

阅读(1558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~