pugna
全部博文(171)
分类: 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,否则将无法进行直接路径写入。