shrink過程和move過程日志産生量比較:
關于日志的問題,我們對比了同樣資料量和分布狀況的兩張table,在move和shrink下生成的redo size(table上沒有index的情況下):
SQL> select tablespace_name,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name
='ASSMTEST';
TABLESPACE_NAME SEGMENT_SPACE_MANAGEMENT
------------------------------ ------------------------
ASSMTEST AUTO
SQL> create table my_objects as select * from dba_objects ;
SQL> create table my_objects1 as select * from dba_objects ;
SQL> select bytes/1024/1024 from user_segments where segment_name = 'MY_OBJECTS';
BYTES/1024/1024
---------------
9
SQL> delete from my_objects where object_name like '%C%';
7278 rows deleted
SQL> delete from my_objects1 where object_name like '%C%';
SQL> delete from my_objects where object_name like '%U%';
2732 rows deleted
SQL> delete from my_objects1 where object_name like '%U%';
SQL> commit;
Commit complete
SQL> alter table my_objects enable row movement;
Table altered
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
VALUE
----------
84466796
SQL> alter table my_objects shrink space;
Table altered.
97945584
SQL> alter table my_objects1 move;
98004004
對于table my_objects,進行shrink,産生了 97945584 - 84466796 =
13 478 788,約13.5M的redo
;對table my_objects1進行move,産生了98004004-97945584=
58 420,約 58K 的 redo size.
那麼,與move比較起來,shrink的日志寫要大得多.
其最根本的原因,我們可以從move和shrink的原理中找到,shrink是行的移動,相當于對資料塊内的資料行删除然後插入的操作,會産生大量的undo redo資訊;
而move是對資料塊的移動操作,不會産生dml操作類似的undo資訊。