前天在 “TABLE的logging属性” 文章中留下了一个问题:table的logging属性到底从哪里可以提现出来???
今天在网上找到这么一句话:NOLOGING选项只是在direct-load模式下才不写redo log,nomal DML无效
上篇文章已经验证了nologging属性对update动作是无效的,下面就用direct-load模式来验证下这句话对不对。
1. 删除结构相同的表test1,test2;
TRUNCATE TABLE TEST2;
TRUNCATE TABLE TEST1;
2. 看下表test1,test2的logging属性;
SELECT t.TABLE_NAME,t.LOGGING FROM dba_tables t
WHERE t.TABLE_NAME IN ('TEST2','TEST1');
TABLE_NAME LOG
------------------------------ ---
TEST2 YES
TEST1 NO
3. 依然开两个session分别执行insert动作,并观察session的redo变化量;
session1:
SELECT a.VALUE
FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
AND b.NAME='redo size';
VALUE
------------------
0 ---------执行insert之前的redo size
SQL> INSERT/*+append*/ INTO TEST1 SELECT OBJECT_ID,OBJECT_NAME FROM DBA_OBJECTS; ---------执行insert动作,append即为直接加载模式
49804 rows created.
SQL> commit;
Commit complete.
SELECT a.VALUE
FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
AND b.NAME='redo size';
VALUE
------------------
48324 ---------执行insert之后的redo size
session2:
SELECT a.VALUE
FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
AND b.NAME='redo size';
VALUE
------------------
0 ---------执行insert之前的redo size
SQL> INSERT/*+append*/ INTO TEST1 SELECT OBJECT_ID,OBJECT_NAME FROM DBA_OBJECTS; ---------执行insert动作,append即为直接加载模式
49804 rows created.
SQL> commit;
Commit complete.
SELECT a.VALUE
FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
AND b.NAME='redo size';
VALUE
------------------
1989324 ---------执行insert之后的redo size
这里就可以明显看到nologging属性的差别,真的是有在直接加载的模式下才能看到区别!!!!对不要/*+append*/的insert我也做过测试,产生的redo量差不多。。。
所以/*+append*/一般与nologging搭配一起用,效果更加明显!!