通過shrink操作重整表的實驗

wei-xh發表於2010-05-08
實驗目的:
1)shrink 操作是否產生redo。
2)shrink操作PK重建表

實驗一:shrink 操作是否產生redo
SQL>conn scott/tiger
SQL> set serveroutput on
SQL> EXEC show_space_assm('TEST2','SCOTT');
free space 0-25% Blocks:................0                                       
free space 25-50% Blocks:...............260                                    
free space 50-75% Blocks:...............145                                    
free space 75-100% Blocks:..............81                                      
Full Blocks:............................9958                                    
Unformatted blocks:.....................0                                       

PL/SQL 過程已成功完成。

由上輸出可以知道這個表存在shrink的餘地。
SQL> select a.name,b.value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name='redo size';

NAME                                                                  VALUE     
---------------------------------------------------------------- ----------     
redo size                                                               664     

SQL> alter table test2 enable row movement;

表已更改。

SQL> alter table test2 shrink space cascade;

表已更改。

SQL> select a.name,b.value from v$statname a,v$mystat b where a.statistic#=b.statistic# and a.name='redo size';

NAME                                                                  VALUE     
---------------------------------------------------------------- ----------     
redo size                                                          15481444     

SQL> EXEC show_space_assm('TEST2','SCOTT');
free space 0-25% Blocks:................2
free space 25-50% Blocks:...............2
free space 50-75% Blocks:...............0
free space 75-100% Blocks:..............0
Full Blocks:............................10155
Unformatted blocks:.....................0

PL/SQL 過程已成功完成。

SQL> spool off

由於是我的測試庫,只有我一個會話當前。由實驗可得出結論:shrink操作會產生redo記錄。這個實驗中產生了(15481444-664/)/1024/1024=15M的日誌。

實驗二:shrink表以後,空間的利用率跟重建表哪個操作更佳。
SQL> EXEC show_space_assm('TEST1','SCOTT');
free space 0-25% Blocks:................0                                       
free space 25-50% Blocks:...............0                                       
free space 50-75% Blocks:...............1                                       
free space 75-100% Blocks:..............0                                       
Full Blocks:............................10338                                   
Unformatted blocks:.....................0                                       

PL/SQL 過程已成功完成。

SQL> SELECT blocks FROM dba_tables WHERE table_name='TEST1';

    BLOCKS                                                                     
----------                                                                     
     10339                                                                     
shrink前,此表的塊數十10339
SQL> delete from test1 where object_id like '14%';

已刪除17760行。

SQL> commit;


SQL> EXEC show_space_assm('TEST1','SCOTT');

PL/SQL 過程已成功完成。

SQL> EXEC show_space_assm('TEST1','SCOTT');
free space 0-25% Blocks:................51                                      
free space 25-50% Blocks:...............179                                    
free space 50-75% Blocks:...............127                                    
free space 75-100% Blocks:..............96                                      
Full Blocks:............................9886                                    
Unformatted blocks:.....................0                                       

PL/SQL 過程已成功完成。


SQL> alter table test1 enable row movement;

表已更改。

SQL> alter table test1 shrink space cascade;

表已更改。


SQL> BEGIN
  2    DBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
  3                                  TABNAME    => 'TEST1',
  4                                  CASCADE    => TRUE,
  5                                  METHOD_OPT => 'FOR ALL COLUMNS SIZE auto');
  6  END;
  7  /

PL/SQL 過程已成功完成。

SQL> SELECT blocks FROM dba_tables WHERE table_name='TEST1';

    BLOCKS                                                                     
----------                                                                     
     10064                                                                     

shrink後,此表的塊數下降到10064。
看看重建表的塊數是多少。
SQL> create table test2 as select * from test1;

表已建立。

SQL> BEGIN
  2    DBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
  3                                  TABNAME    => 'TEST2',
  4                                  CASCADE    => TRUE,
  5                                  METHOD_OPT => 'FOR ALL COLUMNS SIZE auto');
  6  END;
  7  /

PL/SQL 過程已成功完成。

SQL> SELECT blocks FROM dba_tables WHERE table_name='TEST2';

    BLOCKS                                                                     
----------                                                                     
     10340                                                                     

SQL> set serveroutput on
SQL> EXEC show_space_assm('TEST2','SCOTT');
free space 0-25% Blocks:................0                                       
free space 25-50% Blocks:...............0                                       
free space 50-75% Blocks:...............0                                       
free space 75-100% Blocks:..............0                                       
Full Blocks:............................10193                                   
Unformatted blocks:.....................0                                       

PL/SQL 過程已成功完成。

SQL> spool off

從實驗看出:
shrink後,塊的數量從10339降低到了10064。
重新建表後,塊的數量為10340。
看來shrink操作重整表還是蠻不錯的,不過日誌量還是蠻大的。


還有點沒想明白。為什麼重建表後,竟然會比shrink前還大呢?

重建後10340>shrink前的10339.

我以為是create table test2 as。。。。。 語句的問題。
浴室我把test2表shrink,重新分析表test2後,還是10340大小。
在這一點上有點暈。
不過我又執行了一下show_space
SQL> EXEC show_space_assm('TEST2','SCOTT');
free space 0-25% Blocks:................0                                       
free space 25-50% Blocks:...............0                                       
free space 50-75% Blocks:...............0                                       
free space 75-100% Blocks:..............0                                       
Full Blocks:............................10193                                   
Unformatted blocks:.....................0                                       

為什麼show_space和user_tables的block相差這麼多呢?

[ 本帖最後由 wei-xh 於 2010-5-2 20:48 編輯 ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22034023/viewspace-662235/,如需轉載,請註明出處,否則將追究法律責任。

相關文章