加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle_操作如何减少产生日志量.nologging

(2015-06-08 00:55:55)
标签:

nologging

redo

oracle

dml

分类: oracleops
 

     对数据库操作理论上是都需要记录REDO,但是有时为加快操作速度,对一些操作进行NOLOGGING,那么如 何书写或者在上面情景下才能真正的做的NOLOGGING操作呢?
    
    试验对于INSERT INTO SELECT * FROM table操作,其他操作无法减少日志量。
    在非归档模式下,
        不管NOLOGGING,LOGGING模式,APPEND都产生少量的REDO, NO APPEND日志量不变。
     在归档模式下,
         NOLOGGING模式下,APPEND 产生少量的REDO, NO APPEND日志量不变。
         LOGGING模式下,产生日志量不变。
        (这里nologging是指,表,表空间,数据库级别下都是nologging,logging是指,只要其中一个是 force logging /logging)
                 
----------------------归档模式

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
SQL> CREATE TABLE logtab AS SELECT * FROM dba_objects WHERE 1=2;
Table created.
SQL> SELECT force_logging FROM v$database;
FOR
---
NO
SQL> 
SQL> SELECT logging FROM dba_tables WHERE table_name='LOGTAB';
LOG
---
YES
SQL> INSERT INTO logtab SELECT * FROM dba_objects ;
14524 rows created.
----------------------------------------------------------
    1593448  redo size

SQL>  INSERT INTO logtab SELECT * FROM dba_objects ;

14524 rows created.
----------------------------------------------------------
    1582344  redo size


SQL> alter table test.logtab nologging;

Table altered.

SQL> SELECT logging FROM dba_tables WHERE table_name='LOGTAB';
LOG
---
NO

SQL> SQL>  INSERT INTO logtab SELECT * FROM dba_objects ;
14524 rows created.
----------------------------------------------------------
    1534188  redo size

SQL> INSERT INTO logtab SELECT * FROM dba_objects ;

14524 rows created.
----------------------------------------------------------
        620  redo size
        

SQL> 
SQL> alter database force logging;

Database altered.

SQL> 
SQL> 
SQL> SELECT force_logging FROM v$database;

FOR
---
YES
SQL> SELECT logging FROM dba_tables WHERE table_name='LOGTAB';

LOG
---
NO

SQL>     INSERT INTO logtab SELECT * FROM dba_objects ;

14524 rows created.
----------------------------------------------------------
    1541864  redo size

SQL>  INSERT INTO logtab SELECT * FROM dba_objects ;

14524 rows created.
----------------------------------------------------------
    1580076  redo size
        
        

SQL> INSERT INTO logtab SELECT * FROM dba_objects nologging;

14524 rows created.
----------------------------------------------------------
    1534084  redo size     
    
    
    
SQL> INSERT INTO logtab (object_id,object_name) VALUES(111111,'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD');

1 row created.
----------------------------------------------------------
        328  redo size
SQL> INSERT  INTO logtab (object_id,object_name) VALUES(111111,'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD');

1 row created.
----------------------------------------------------------
        328  redo size

SQL>  INSERT INTO logtab (object_id,object_name) VALUES(111111,'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD');

1 row created.
----------------------------------------------------------
        440  redo size



归档模式下,只有NOLOGGING+APPEND才能产生少量日志。对于INSERT VALUES模式APPEND不起作用。

非归档模式下,不管nologging、logging, append都会减少日志量。


----不正确的NOLOGGING 操作。

INSERT INTO T1 SELECT * FROM T2 NOLOGGING;  
INSERT INTO T1 VALUES ('0');  
INSERT INTO T1 SELECT * FROM T2;  
DELETE FROM T1;  
UPDATE T1 SET A='1';  

----正确的NOLOGGING 操作。

CREATE TABLE T1 NOLOGGING AS SELECT * FROM T2;  
CREATE INDEX T1_IDX ON T1(A) NOLOGGING;  
ALTER INDEX T1_IDX REDUILD ONLINE NOLOGGING;  




对于HINT的正确使用,, 检查顺序是从左向右,当遇到第一个保留字(v$reserved_words)时宣告后面 HINT无效。



综上所述, 少量日志的时候还是比较少的。那么在这种情况下如何提高呢?  对的,是并行(parallel) ,下次我们实验下parallel的HINT以及正确使用。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有