ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle nologging和append

oracle nologging和append

原创 Linux操作系统 作者:47328983 时间:2012-05-23 15:17:41 0 删除 编辑
前段时间,做一些SQLLDR的数据导进数据库,思考了一下,如何能把导入速度提高一下。所以就GOOGLE了一下。找到了一些NOLOGGING和APPEND的相关资料,在此记录一下。

----------------------------------------------------

有许多朋友误已写SQL或把表的属性加NOLOGGING,就可以不采成日志。这是一个误解。

在数据迁移或大量的数据insert入库时,由于大量数据的insert或修改,经常引起redo log sync的等待,造成数据库性能缓慢。
因为许多朋友对NOLOGGING的误解,所以许多人在insert数据时,在SQL后加nologging,想通过该用法使操作不采生日记录。但无效果。
这里讨论nologging的具体用法:

数据库操作,只有如下几种情况下不产成redo记录:
1、用sql*load的direct load方式时,不采用redo记录
2、用insert的direct方式,即在append方式insert
3、create table .... as select
4、create index
5、alter table ... move partition
6、alter table ... split partition
7、alter index ... split partition
8、alter index ... rebuild
9、alter index ... rebuild partition
10、INSERT, UPDATE, and DELETE on LOBs in NOCACHE NOLOGGING mode stored out of line

---------------------------------------------------

可以采用NOLOGGING模式执行以下操作: 
1 索引的创建和ALTER(重建)。 
2 表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是 
所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。 
3 LOB操作(对大对象的更新不必生成日志)。 
4 通过CREATE TABLE AS SELECT创建表。 
5 各种ALTER TABLE操作,如MOVE和SPLIT。 
在一个ARCHIVELOG模式的数据库上,如果NOLOGGING使用得当,可以加快许多操作的速度,因为它能显著减少生成的重做日 
志量。假设你有一个表,需要从一个表空间移到另一个表空间。可以适当地调度这个操作,让它在备份之后紧接着发生,这样就能把表 
ALTER为NOLOGGING模式,移到表,创建索引(也不生成日志),然后再把表ALTER回LOGGING模式。现在,原先需要X小时才能 
完成的操作可能只需要X/2 小时(运行是会不会真的减少50%的时间,这一点我不敢打保票!)。要想适当地使用这个特性,需要DBA的 
参与,或者必须与负责数据库备份和恢复(或任何备用数据库)的人沟通。如果这个人不知道使用了这个特性,一旦出现介质失败,就可 
能丢失数据,或者备用数据库的完整性可能遭到破坏。对此一定要三思。 
使用范例 
create table t 
NOLOGGING 
as 
select * from all_objects 
关于NOLOGGING操作,需要注意以下几点: 
1 事实上,还是会生成一定数量的redo。这些redo的作用是保护数据字典。这是不可避免的。与以前(不使用NOLOGGING)相 
比,尽管生成的redo量要少多了,但是确实会有一些redo。 
2 NOLOGGING不能避免所有后续操作生成redo。在前面的例子中,我创建的并非不生成日志的表。只是创建表(CREATE TABLE) 
这一个操作没有生成日志。所有后续的“正常“操作(如INSERT、UPDATE和DELETE)还是会生成日志。其他特殊的操作(如 
使用SQL*Loader的直接路径加载,或使用INSERT /*+ APPEND */语法的直接路径插入)不生成日志(除非你ALTER这个表, 
再次启用完全的日志模式)。不过,一般来说,应用对这个表执行的操作都会生成日志。 
3 在一个ARCHIVELOG 模式的数据库上执行NOLOGGING 操作后,必须尽快为受影响的数据文件建立一个新的基准备份,从而 
避免由于介质失败而丢失对这些对象的后续修改。实际上,我们并不会丢失后来做出的修改,因为这些修改确实在重做日志中; 
我们真正丢失的只是要应用这些修改的数据(即最初的数据)。

----------------------------------------------------------------

1. append方式添加记录对insert into ... values语句不起作用。

2. 以append方式批量插入的记录,其存储位置在hwm 之上,即使hwm之下存在空闲块也不能使用。

3. 以append方式插入记录后,要执行commit,才能对表进行查询。否则会出现错误:

ORA-12838: 无法在并行模式下修改之后读/修改对象

4. 在归档模式下,要把表设置为nologging,然后以append方式批量添加记录,才会显著减少redo数量。在非归档模式下,不必设置表的nologging属性,即可减少redo数量。如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。

用insert append可以实现直接路径加载,速度比常规加载方式快。但有一点需要注意: insert append时在表上加“6”类型的锁,会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度。因为每一时刻只能有一个进程在加载(排它锁造成)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/241379/viewspace-730684/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle的Move操作
请登录后发表评论 登录
全部评论

注册时间:2009-03-07

  • 博文量
    111
  • 访问量
    332657