新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: 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;
这些操作都使用直接路径加载,需要注意的是单行插入不会使用直接路径加载。
直接路径加载的锁问题
传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他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选项,确保对于所有操作总是会产生重做,即使是直接路径加载。