oracle redo与undo_笔记5:在SQL中设置NOLOGGING
在SQL中设置NOLOGGING
有些SQL语句和操作支持使用NOLOGGING子句。这并不是说:这个对象的所有操作在执行时都不生成重做日志,而是说有些特定操作生成的redo会比平常(即不使用NOLOGGING子句时)少得多。所有操作都会生成一些redo——不论日志模式是什么,所有数据字典操作都会记入日志。只不过使用NOLOGGING子句后,生成的redo量可能会显著减少。
sys@ORCL>select log_mode fo rom v$sta database;
LOG_MODE
------------------------------------
ARCHIVELOG
sys@ORCL>dr drop table t;
Table dropped.
sys@ORCL>variable redo number
sys@ORCL>exec :redo :=get_stat_val('redo size');
PL/SQL procedure successfully completed.
sys@ORCL>create table t
2 as
3 select * from all_objects;
Table created.
sys@ORCL>exec dbms_output.put_line((get_stat_val('redo size')-:redo) || 'bytes of redo generated...');
8609344bytes of redo generated...
PL/SQL procedure successfully completed.
这个CREATE TABLE生成了大约8.6MB的redo信息。接下来删除这个表,再重建,不过这一次采用NOLOGGING模式:
sys@ORCL>drop table t;
Table dropped.
sys@ORCL>variable redo number
sys@ORCL>exec :redo :=get_stat_val('redo size');
PL/SQL procedure successfully completed.
sys@ORCL>create table t
2 nologging
3 as
4 select * from all_objects;
Table created.
sys@ORCL>exec dbms_output.put_line((get_stat_val('redo size')-:redo) || 'bytes of redo generated...');
78856bytes of redo generated...
PL/SQL procedure successfully completed.
这一次,只生成了78KB的redo信息。可以看到,差距很悬殊:原来的8.6MB的redo,现在只有78KB。第一个例子中写入的8.6MB是实际的表数据副本,当表为NOLOGGING时,它被写入redo日志。
如果对一个NOARCHIVELOG模式的数据库运行这个测试,就看不到两者之间有什么差别。在NOARCHIVELOG模式的数据库中,除了数据字典的修改外,CREATE TABLE不会记录日志。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5261.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
