oracle nologging什么场景才能减少redo日志的产生
2013-12-05 14:53
696 查看
先说一下,经过自己的测试,发现oracle为了满足recover的要求,nologging实际上很少能够起作用,网上也有很多这方面的资料和测试,本文为亲身测试,发现在自己需要的场景中nologging完全失效,特做记录,并到官网上查询了一下什么操作在指定nologging的属性下会较少redo的产生。
表tlog
表tnolog
两个表的定义
create table tlog (id number,namevarchar2(1000));
create table tnolog (id number,namevarchar2(1000)) nologging;
生成归档量查询语句:
CREATE OR REPLACE VIEW redo_size
AS
SELECT VALUE
FROM v$mystat, v$statname
WHERE v$mystat.statistic# = v$statname.statistic#
AND v$statname.NAME = 'redo size';
执行如下过程查看归档量
begin
fori in 1..100000 loop
insert into tlogvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
执行前:
SQL> select * from sys.redo_size;
VALUE
----------
2063355264
执行后:
SQL> select * from sys.redo_size;
VALUE
----------
2119850312
redo生成:2119850312-2063355264=56495048
执行如下过程查看归档量
begin
fori in 1..100000 loop
insert into tnologvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
执行前:
SQL> select * from sys.redo_size;
VALUE
----------
2119850312
执行后:
SQL> select * from sys.redo_size;
VALUE
----------
2176210336
redo生成:2176210336-2119850312=56360024
非归档模式生成:56360024
没什么区别
select table_name,logging from dba_tableswhere table_name in ('TLOG','TNOLOG');
TABLE_NAME LOGGING
TLOG YES
TNOLOG NO
那物化视图的刷新呢:
创建物化视图日志:
create materialized view log on tlog withsequence,rowid;
准备数据:
truncate table tlog;
truncate table tnolog;
begin
fori in 1..100000 loop
insert into tlogvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
查看mv log中的行数:
SQL> select count(*) from MLOG$_TLOG;
COUNT(*)
----------
100000
创建物化视图:
create materialized view mv_tlog
BUILD DEFERRED
refresh fast on demand with rowid
as
select * from tlog;
create materialized view mv_tnolog nologging
BUILD DEFERRED
refresh fast on demand with rowid
as
select * from tlog;
刷新查看归档量
刷新mv_tlog
SQL> select * from sys.redo_size;
VALUE
----------
2419178948
exec dbms_mview.refresh('MV_TLOG','C');
SQL> select * from sys.redo_size;
VALUE
----------
2440166340
生成归档量: 2440166340-2419178948=20987392
刷新mv_tnolog
SQL> select * from sys.redo_size;
VALUE
----------
2440166340
exec dbms_mview.refresh('MV_TNOLOG','C');
SQL> select * from sys.redo_size;
VALUE
----------
2461706932
生成归档量: 2461706932-2440166340=21540592
刷新nologging的物化视图生成归档量 21540592
nologging不少反多,真是奇怪。
/*+ append */
http://blog.csdn.net/linminqin/article/details/6602476
最后边有一个结论。
可惜物化视图的刷新不能使用append,一切幻想就成泡沫了。
表tlog
表tnolog
两个表的定义
create table tlog (id number,namevarchar2(1000));
create table tnolog (id number,namevarchar2(1000)) nologging;
生成归档量查询语句:
CREATE OR REPLACE VIEW redo_size
AS
SELECT VALUE
FROM v$mystat, v$statname
WHERE v$mystat.statistic# = v$statname.statistic#
AND v$statname.NAME = 'redo size';
执行如下过程查看归档量
begin
fori in 1..100000 loop
insert into tlogvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
执行前:
SQL> select * from sys.redo_size;
VALUE
----------
2063355264
执行后:
SQL> select * from sys.redo_size;
VALUE
----------
2119850312
redo生成:2119850312-2063355264=56495048
执行如下过程查看归档量
begin
fori in 1..100000 loop
insert into tnologvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
执行前:
SQL> select * from sys.redo_size;
VALUE
----------
2119850312
执行后:
SQL> select * from sys.redo_size;
VALUE
----------
2176210336
redo生成:2176210336-2119850312=56360024
结论:
归档模式生成: 56495048非归档模式生成:56360024
没什么区别
select table_name,logging from dba_tableswhere table_name in ('TLOG','TNOLOG');
TABLE_NAME LOGGING
TLOG YES
TNOLOG NO
那物化视图的刷新呢:
创建物化视图日志:
create materialized view log on tlog withsequence,rowid;
准备数据:
truncate table tlog;
truncate table tnolog;
begin
fori in 1..100000 loop
insert into tlogvalues(i,'sdljfalsdjflasjdflsajdflkjasdlfkjasld;kfj'||i||'asjdfljssjd;lfja;sd'||i);
commit;
endloop;
end;
/
查看mv log中的行数:
SQL> select count(*) from MLOG$_TLOG;
COUNT(*)
----------
100000
创建物化视图:
create materialized view mv_tlog
BUILD DEFERRED
refresh fast on demand with rowid
as
select * from tlog;
create materialized view mv_tnolog nologging
BUILD DEFERRED
refresh fast on demand with rowid
as
select * from tlog;
刷新查看归档量
刷新mv_tlog
SQL> select * from sys.redo_size;
VALUE
----------
2419178948
exec dbms_mview.refresh('MV_TLOG','C');
SQL> select * from sys.redo_size;
VALUE
----------
2440166340
生成归档量: 2440166340-2419178948=20987392
刷新mv_tnolog
SQL> select * from sys.redo_size;
VALUE
----------
2440166340
exec dbms_mview.refresh('MV_TNOLOG','C');
SQL> select * from sys.redo_size;
VALUE
----------
2461706932
生成归档量: 2461706932-2440166340=21540592
结论:
刷新logging的物化视图生成归档量 20987392刷新nologging的物化视图生成归档量 21540592
nologging不少反多,真是奇怪。
终极结论:
像网上说的一样,nologging是在归档模式下的append下才会减少归档生成,这个属性有什么用途真是让人摸不到头脑。/*+ append */
http://blog.csdn.net/linminqin/article/details/6602476
最后边有一个结论。
数据库模式 | 表模式 | 插入模式 | REDO生成 |
ARCHIVELOG | LOGGING | APPEND | 有REDO |
NO APPEND | 有REDO | ||
NOLOGGING | APPEND | 无REDO | |
NO APPEND | 有REDO | ||
NOARCHIVELOG | LOGGING | APPEND | 无REDO |
NO APPEND | 有REDO | ||
NOLOGGING | APPEND | 无REDO | |
NO APPEND | 有REDO |
可惜物化视图的刷新不能使用append,一切幻想就成泡沫了。
哪些货语句可以减少redo,看mos上的说法:
| 9876
***Checked for relevance on 25-Jul-2010*** · goal: How to Avoid Generation of Redolog Entries · · fact: Oracle Server - Enterprise Edition 8.1 · · fact: Oracle Server - Enterprise Edition 9.0.1 · · fact: Oracle Server - Enterprise Edition 9.2 · · fact: Oracle Server - Enterprise Edition 10.1 · · fact: Oracle Server - Enterprise Edition 10.2 · · fact: Oracle Server - Enterprise Edition 11.1 · · fact: Oracle Server - Enterprise Edition 11.2 · fix: The option NOLOGGING valid since Oracle8 can be used to avoid the redolog entries generation for a certain operation, that can be easily recovered without using the database recovery mechanism. The following operations can make use of nologging mode: - direct load (SQL*Loader) - direct-load INSERT - CREATE TABLE ... AS SELECT - CREATE INDEX - ALTER TABLE ... MOVE PARTITION - ALTER TABLE ... SPLIT PARTITION - ALTER INDEX ... SPLIT PARTITION - ALTER INDEX ... REBUILD - ALTER INDEX ... REBUILDPARTITION - INSERT /*+APPEND*/ INTO
|
相关文章推荐
- Oracle NoLogging Append 方式减少批量insert的redo_size
- Script:列出Oracle每小时的redo重做日志产生量
- Oracle数据库减少redo日志产生方式
- 那些被你忽略的性能 - Oracle Redo的产生场景及优化
- Oracle NoLogging Append 方式减少批量insert的redo_size
- 实验: Oracle中表shrink与move产生redo日志比较
- oracle体系结构之redo日志缓存池,大共享区
- Oracle中临时表产生过量Redo的说明
- 20061023个人技术日志(mssql链接服务器链接到oracle,由于数据长度不定产生的问题)
- Oracle 重做(Redo)日志介绍
- 启动Oracle后台服务器的方法_用来检测产生错误的原因,会打印日志
- oracle 在操作blob该字段是否会产生很多redo
- 非IMU模式下DML语句产生的REDO日志内容格式解读
- Oracle redo log 大小及组数的设置(在线修改日志组数目及组成员个数)
- oracle 丢失日志(redoxx_xx)文件后的处理方法
- Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
- Oracle丢失重做日志的几种场景恢复
- ORACLE 非归档模式下REDO日志丢失修复
- 查看Oracle的redo日志切换频率
- Oracle中临时表产生过量Redo的说明