一. NOLOGGING 说明在对大表插入数据的时候,经常会用到nologging 选项。Nologging 并不是不产生redo,nologging + direct 只是不会对数据产生 redo(但依然有其他的redo)。同理 logging + direct 下 undo 也是大大地减少, 减少的是 数据的undo ,这里强调的是 数据本身的undo ,就如同 redo的减少也一样,是 数据本身的 redo ,这和数据库是否产生 redo 和 undo 是不同的概念,比如空间分配的 redo and undo ,这就不是数据本身的变化。 在非归档模式下, 对于nologging 和 logging模式,只有使用 append,才不会对数据生成redo。 在归档模式下,只有将表置于nologging 模式,并且使用append 才不会对数据生成redo. 二. 归档模式下的示例两个查询用的脚本
--new.sql
column OLD_VALUE new_value OLD_VALUE
select value OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = ""redo size"";
--diff.sql
select (value - &OLD_VALUE) OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = ""redo size""; 数据库运行在归档模式
SQL> archive log list数据库日志模式 存档模式自动存档 启用存档终点 d:/archivelog最早的联机日志序列 125下一个存档日志序列 127当前日志序列 127
2.1 Create TABLE
SQL> @?/new.sql OLD_VALUE---------- 8535492
SQL> create table T_NOLOG nologging as select * from all_objects;表已创建。
SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 8535492) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 83496
注:REDO SIZE=83496
SQL> @?/new.sql OLD_VALUE---------- 8618988
SQL> create table T_LOG logging as select * from all_objects;表已创建。
SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 8618988) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 8491836
注:REDO SIZE=8491836
总结:通过上面的2个例子,可以看出用nologging 创建表,不会对数据生成redo,仅对数据字典生成redo. create table with nologging... not generate redo, just generate for data dictionary
2.2 DELETE
SQL> @?/new.sql OLD_VALUE---------- 17110824
SQL> DELETE FROM T_NOLOG;已删除71711行。
SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 17110824) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 26592364
注:REDO SIZE=26592364
SQL> @?/new.sql OLD_VALUE---------- 43703188SQL> DELETE FROM T_LOG; 已删除71712行。
SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 43703188) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 26592560
注:REDO SIZE=26592560
2.3 INSERT
SQL> @?/new.sql OLD_VALUE---------- 70295748SQL> INSERT INTO T_NOLOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 70295748) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 8169900
注:REDO SIZE=8169900
SQL> @?/new.sql OLD_VALUE---------- 78465648SQL> INSERT INTO T_LOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 78465648) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 8169796
注:REDO SIZE=8169796
2.4 UPDATE
SQL> @?/new.sql OLD_VALUE---------- 86635444SQL> UPDATE T_NOLOG SET OBJECT_ID=1;已更新71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 86635444) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 24323896
注:REDO SIZE=24323896
SQL> @?/new.sql OLD_VALUE---------- 110959340SQL> UPDATE T_LOG SET OBJECT_ID=1;已更新71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 110959340) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 36490988
注:REDO SIZE=20911424
总结: insert/update/delete 的DML 操作,在logging和nologging上没有区别
On DML insert/update/delete redo size with nologging not difference... with logging.
2.5 Show case "APPEND" hints
2.5.1 table NOLOGGING and not use APPEND hints
SQL> @?/new.sql OLD_VALUE---------- 147450328SQL> INSERT INTO T_NOLOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 147450328) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 8325816
注: REDO SIZE=8325816
SQL> @?/new.sql OLD_VALUE---------- 155776144SQL> INSERT /*+ APPEND */ INTO T_NOLOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 155776144) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 14852
注:REDO SIZE=14852,采用append后,redo size大幅减小
2.5.2 table LOGGING, and use APPEND hints
SQL> @?/new.sql OLD_VALUE---------- 155790996SQL> INSERT /*+ APPEND */ INTO T_LOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 155790996) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 8406068
注:REDO SIZE=8640396, redo size 没什么变化
将表改为nologging 模式,在查看
SQL> @?/new.sql OLD_VALUE---------- 164200200SQL> INSERT /*+ APPEND */ INTO T_LOG SELECT * FROM ALL_OBJECTS;已创建71712行。SQL> @?/diff原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where新值 1: select (value - 164200200) OLD_VALUE from v$mystat, v$statname where OLD_VALUE---------- 15012
注:REDO SIZE=27956
总结: 通过实验看出,对于logging 模式, 使用append hint 在生成redo 上没有什么变化对于nologging模式,使用append hint 对数据没有生成redo,仅对数据字典生成了redo.
APPEND hints on table "logging" not difference (generate redo).
If "alter table nologging" before, and then insert (append)... it""s work with nologging (not generate redo, just redo for data dictionary).
如何加快建 index 索引 的时间Oracle SQL Loader相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)