为什么会有这么多记录?
我以非记录模式对一个表执行以下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博客 ” ,链接:https://blog.itpub.net/29987/viewspace-51861/ ,如需转载,请注明出处,否则将追究法律责任。