难以琢磨的redo log (什么情况下产生redo)

来源:互联网 发布:js数组和对象的区别 编辑:程序博客网 时间:2024/04/29 01:20

这段时间想弄明白什么情况下对表的操作会产生日志,以及想避免产生日志时需要做哪些动作;

首先select *from v$sysstat twhere t.class=2;找到nameredo size的行的STATISTIC#

然后创建一张表,在上面做DML ,查看select * from v$sysstat t where t.STATISTIC#=刚才找到的那个值; 根据两次的value查看是否产生以及产生多少redo;

做了很多实验,发现:

在nologging表上用/*+ append */提示时,产生很少的redo; 在logging表上用/*+ append */提示时,也产生很少的redo;

 

于是就在网上查资料,看到了一篇不错的,摘录在此,以便参考(http://www.askmaclean.com/archives/oracle%e4%b8%ad%e5%8f%af%e4%bb%a5nologging%e6%89%a7%e8%a1%8c%e7%9a%84%e6%93%8d%e4%bd%9c.html#comments):


 

 TABLE MODE         INSERT MODE       ARCHIVELOG MODE       RESULT
———————       ——————-          —————————        ———-
LOGGING               APPEND               ARCHIVE LOG                      REDO GENERATED
NOLOGGING         APPEND               ...                                              NO REDO
LOGGING               NO APPEND        ...                                              REDO GENERATED
NOLOGGING         NO APPEND        ...                                              REDO GENERATED
LOGGING               APPEND              NOARCHIVE LOG MODE     NO REDO
NOLOGGING         APPEND              ...                                               NO REDO
LOGGING               NO APPEND       ...                                               REDO GENERATED
NOLOGGING         NO APPEND       ...                                               REDO GENERATED

 

redo重做日志是Oracle数据库恢复(recovery)的基础;但在很多情况下可以通过禁用重做日志的产生来加速SQL语句的完成,也就是我们所说的可nologging化的操作,这些操作大多是或串行的或并行的数据载入。

那么哪些操作是允许被nologging化的呢?首先需要注意的是普通的DML操作,即:常规insert,update,和delete(以及merge)总是不能被nologging执行的。但以下SQL语句则可以以nologging选项执行:

  • direct load (SQL*Loader)
  • direct load INSERT (using APPEND hint)
  • CREATE TABLE … AS SELECT
  • CREATE INDEX
  • ALTER TABLE … MOVE PARTITION
  • ALTER TABLE … SPLIT PARTITION
  • ALTER INDEX … SPLIT PARTITION
  • ALTER INDEX … REBUILD
  • ALTER INDEX … REBUILD PARTITION
  • INSERT, UPDATE, and DELETE on LOBs in NOCACHE NOLOGGING mode stored out of line

以上列出的语句,其产生undo和redo重做日志几乎可以完全禁绝。因为都是数据载入语句(或者装载索引)其所产生的新的区间(new extent)在执行过程中被标记为无效的(invalid),同时仅有少量的由数据字典变更引起的重做日志会产生。

 

原创粉丝点击