Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1213386
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:49:15

直接加载操作为直接加载大量数据提供了一个高效的机制。其通过绕过标准的空闲列表或者assm识别可用来插入的空间。直接加载操作直接到hwm以上的未格式化块,直接将数据加载到这些块上并写入磁盘,绕过缓冲。通过这么做,跳过空闲列表或assm机制快速的找到完全为空的块。另外这些操作不会产生撤销,因此不需要写undo。产生的重做也因此减少,因为undo也会产生重做。

      

直接路径DML的例子

       最主要的包括:

       INSERT /*+ APPEND */,仅适用于堆表,并且如果包含索引,索引不会使用直接路径加载;

       CREATE TABLE AS SELECT

       CREATE INDEX

       ALTER INDEX REBUILD

       ALTER TABLE MOVE

       这些操作都使用直接路径加载,需要注意的是单行插入不会使用直接路径加载。

 

直接路径加载的锁问题

       传统的DMLTM enqueue上使用模式3row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6exclusive),这使其他DML在直接路径加载期间将被阻塞。这意味着在一个段上的并行直接路径加载将会在TM enqueue上串行化。

       通俗的说,如果使用传统的方法插入一条记录到EMP表中,这不会阻止其他会话更新,插入,删除EMP表中其他的纪录;但是如果使用直接路径加载,在执行加载期间,整个EMP表都会被锁住,除了SELECT没有任何DML能够执行。

 

直接路径加载的恢复问题

       NOLOGGING子句是段的一个属性,通常被忽略。如果创建表时声明了NOLOGGING,普通的操作,如插入,更新,删除将仍然产生redo'nolog'的指示被完全忽略。

       但是直接路径加载,执行预期的NOLOGGING,几乎不产生redo。也因为这个原因,如果发生介质恢复将需要重新进程加载,而无法依赖于redo进行恢复。

       从技术上来说,如果在一个包含了直接路径加载的数据文件上进行恢复,并且在直接路径加载以后数据文件没有备份过,那么在应用重做日志到文件上时这些块会被标记为'block invalidation markers'。因此这些块被标记为中断,如果尝试读取这些块将会得到ORA-26040 Data block was loaded using the NOLOGGING option错误信息。如果段是一个索引,可以通过删除这个段并重建解决,但是如果为表,可以truncate表然后进行重新加载。如果是表分区,可以truncate那个表分区,然后重新进行加载。

 

Force Logging

       对于任何段来说,绕过重做机制都能够达到高性能,但是会带来严重的恢复问题。同时还可能会中断某些操作,如DG配置,如果没有产生重做,数据库将会被认为是不同步的。

       Oracle 9i开始,DBA可以在建库时声明FORCE LOGGING选项,确保对于所有操作总是会产生重做,即使是直接路径加载。

阅读(1169) | 评论(0) | 转发(0) |
0

上一篇:关于段压缩

下一篇:deterministic函数的好处

给主人留下些什么吧!~~