ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Tips--Tom對index也差生redo/undo的說明

Tips--Tom對index也差生redo/undo的說明

原创 Linux操作系统 作者:vongates 时间:2019-04-16 14:15:06 0 删除 编辑
今天看到有人提問在加了 append這個hint之后產生redo的疑問,就帖一下tom的說法吧,自己也一會兒做做實踐:

为什么会有这么多记录?

我以非记录模式对一个表执行以下SQL语句,但似乎变化都被记录了下来(并不仅仅是字典发生变化):

SQL> insert /*+ append */ into 
       testusr.contactversion nologging 
select * from 
   perm_owner.contactversion;
297585 rows created.

Statistics
-----------------------------
     12975  recursive calls
    1798143  db block gets
      56538  consistent gets
       9882  physical reads
  125409912 redo size

将表设置为LOGGING或是NOLOGGING都没有关系,都会产生相同数量的REDO。

在这种情况下的答案很简单:你对表进行了索引。不能追加索引,只能对它们进行修改。而这些修改必须被记录。不能产生表自身的redo/undo(恢复/撤销)功能,但是总会产生索引的redo/undo功能,如下面的示例:

SQL> create table t nologging as 
      select* from all_objects where 1=0;
Table created.

SQL> set autotrace on statistics;
SQL> insert /*+ append */ into t 
       select * from all_objects;
34855 rows created.

Statistics
------------------------------
        151  recursive calls
        116  db block gets

     474434  consistent gets
       2173  physical reads
      10208  redo size
...

SQL> truncate table t;
Table truncated.

SQL> create index object_name_idx 
       on t(object_name);
Index created.

SQL> insert /*+ append */ into t 
       select * from all_objects;
34856 rows created.

Statistics
-------------------------------
        205  recursive calls
       3424  db block gets
     474764  consistent gets
      2465  physical reads
    4963388 redo size

...

有了目前的索引,就会产生相当多的REDO。第一个插入的REDO是必须的,它是为了保护数据字典(因为我们对表进行了高级标记)。第二个插入的REDO是为了保护数据字典和索引结构,所以第二个REDO大小统计反映使索引变化能够恢复的信息。

如果可能,在进行类似的大型直接路径(direct-path)插入之前,应首先禁止使用索引,进行加载,然后在NOLOGGING选项下重新建立索引。在那种方式下,你将会有一个非常好的压缩索引,并且端到端的加载时间最短。

http://www.oracle.com/global/cn/oramag/oracle/02-sep/o52asktom.html

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

请登录后发表评论 登录
全部评论

注册时间:2018-09-11

  • 博文量
    201
  • 访问量
    143450