nologging和redo size之间的关系分析 转贴

本文通过实验对比了Oracle数据库不同模式下(归档与非归档),使用多种操作(如CTAS、SQL*Loader、ALTER TABLE MOVE、CREATE INDEX 和 UPDATE/DELETE)时产生的redo大小差异,并特别关注nologging选项的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nologging和redo size之间的关系分析
2011年01月29日 星期六 下午 12:41

试验环境:oracle 9204 on hp-ux

一、使用CTAS方式建表产生redo大小的分析
首先在noarchive模式下试验:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 600

SQL> create table t as select * from dba_objects;
试验后:
SQL>
NAME VALUE
redo差异:30960

2、更改数据库到归档模式,过程省略。。。
table采用默认方式建立:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 1472

SQL> create table t as select * from dba_objects;
试验后:
NAME VALUE
redo size 622448

redo差异:620976,差不多是非归档模式下的20倍

3、table采用nologging方式建立:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 622448

SQL> create table t nologging as select * from dba_objects;

试验后:
NAME VALUE
redo size 654880

redo差异:32432,和非归档模式下差不多



二、使用sqloader+direct产生redo大小的分析
首先在noarchive模式下试验:
试验前:
SQL> select name, value from v$sysstat where name='redo size';
NAME VALUE
redo size 131088

加载:sqlldr userid=dc/dc control=test.ctl

试验后:
NAME VALUE
redo size 164144
redo差异:33056

因为在非归档模式下,不管表是logging还是nologging对直接路径加载生成的redo都没有影响,故不测试表为nologging的情况

2、更改数据库到归档模式,过程省略。。。
table采用默认方式建立:
试验前:
SQL> select name, value from v$sysstat where name='redo size';
NAME VALUE
redo size 5990200

加载:sqlldr userid=dc/dc control=test.ctl

试验后:
NAME VALUE
redo size 10717152

redo差异:4726952,是非归档模式下的100多倍

3、table采用nologging方式建立:
试验前:
SQL> select name, value from v$sysstat where name='redo size';
NAME VALUE
redo size 10825792

加载:sqlldr userid=dc/dc control=test.ctl

试验后:
SQL>
NAME VALUE
redo size 10858848

redo差异:33056,和非归档模式一样



三、alter table move产生redo大小的分析
首先在noarchive模式下试验:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 600

SQL> alter table test move tablespace test;
试验后:
SQL>
NAME VALUE
---------------------------------------------------------------- ----------
redo size 38544
redo差异:37944

2、更改数据库到归档模式
table采用默认方式建立:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
redo size 2816

SQL> alter table test move tablespace test;

试验后:
SQL>
redo size 4767640

redo差异:4764824,是非归档模式下的100多倍

3、move语句换一个方式:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
redo size 9517280

SQL> alter table test move tablespace test nologging;

试验后:
SQL>
NAME VALUE
---------------------------------------------------------------- ----------
redo size 14266928

redo差异:4749648,可见nologging子句没起作用
(注:觉得这个有问题,所以又在10.2.0.2平台上做了一遍,生成的redo和非归档模式差不多,而且move后相关的表也变为nologging的了,而9i里仍为logging,大家可以在其他平台试验一下)

4、table采用nologging方式建立:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 14269024

SQL> alter table test move tablespace test;;

试验后:
NAME VALUE
redo size 14308200

redo差异:39176,和非归档模式下差不多



四、create index产生redo大小的分析
1、首先在noarchive模式下试验:
使用普通create index语句:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 600

SQL> create index idx_test on test(id);

试验后:
SQL>
NAME VALUE
redo size 1862688
redo差异:1862088

使用create index nologging语句:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 3805536

SQL> create index idx_test on test(id) nologging;

试验后:
SQL> /
redo size 3835280
redo差异:29744

2、更改数据库到归档模式
使用普通create index语句:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 600

SQL> create index idx_test on test(id);

试验后:
NAME VALUE
redo size 1862736
redo差异:1862136

使用create index nologging语句:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
redo size 1874344

SQL> create index idx_test on test(id) nologging;

试验后:
NAME VALUE
redo size 1904152
redo差异:29808

由此可得出不管数据库在归档还是非归档模式,建立索引时只有使用nologging子句才能减少redo。
另做了个alter index rebuild的结果也一样,过程就略了。



五、update/delete产生redo大小的分析
数据库使用归档模式
表为logging:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 600

SQL> update test set id=id+1;

试验后:
NAME VALUE
redo size 27290584

redo差异:27289984

表为nologging:
试验前:
SQL> select a.name, b.value from v$statname a, v$sesstat b where a.statistic#=b.statistic# and b.sid=9 and a.name = 'redo size';
NAME VALUE
redo size 45688568

SQL> update test set id=id+1;

试验后:
NAME VALUE
redo size 72978632
redo差异:27290064,两者几乎一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值