我一直以为dba_tables中的logging字段,如果为NO,则表示不对表的更改做log,
官方文档也是这么写的:Indicates whether or not changes to the table are logged; NULL for partitioned tables:
但是今天试验了下,发现不是那么回事!!!
1. 创建两个结构,数据一样的表test1和test2:
CREATE TABLE TEST1 AS SELECT object_id,object_name FROM dba_objects
CREATE TABLE TEST2 AS SELECT object_id,object_name FROM dba_objects
2.设置test1的logging属性为NO:
ALTER TABLE TEST1 NOLOGGING;
SQL> select table_name,logging from dba_tables where table_name in ('TEST1','TEST2');
TABLE_NAME LOGING
------------------------------ --------------
TEST2 YES
TEST1 NO
3. 用两个session,分别记录下redo log的初始值,这里都为0
SELECT c.VALUE FROM v$mystat c,v$statname b
WHERE c.STATISTIC#=b.STATISTIC# AND b.NAME='redo size' ;
4.在两个session中分别执行同样的update动作:
sql1:UPDATE TEST1 SET OBJECT_ID=100;
sql2:UPDATE TEST2 SET OBJECT_ID=100;
5. 再回头在两个session中看看产生的redo量,发现执行sql1产生的redo量为:26106324;sql2产生的redo量为:12762552
SELECT c.VALUE FROM v$mystat c,v$statname b
WHERE c.STATISTIC#=b.STATISTIC# AND b.NAME='redo size' ;
真是想不通,但是时间不早了,要睡觉了,先记下来,明天再写个续集。。。要是哪位高手路过,请指点指点。。。