2008年01月16日

測試redo size

測試目地:得知 temp table跟一般 table 在做處理時產生的 redo size 的差別多少

oracle: 9.2.0.6.0
archivelog:開起
os: Red Hat Enterprise Linux AS release 4 (Nahant Update 1)

結論:
1、表1的數據可看到 temporart table 是 delete rows 時,產生的 redo size是最大的,其他情況之下,redo size 的大小差距並不在。可視為相同的結果
2、表2的數據可看到 一般的 table 在 db 是 archivelog 的狀態下,table 是否為 logging 產生的 redo size 的大小差距並不在。可視為相同的結果
3、表1 跟 表2 相比的話,可明顯看到產生的 redo size 量大致上差了 7倍 ,所以如得知那些 table 是用於處理過後,資料並不需要保留的話,建議把 stanard table 改成 temporary table ,可減少 redo size 產生,進而減少 archive log file 的產生
4、表3的數據可看相同的資料量在做 insert 跟 delete 動作時,產生的 redo size 相差了6倍,所以如程式處理完大筆的資料需要刪除舊有的資料時,可考慮設計成在非繁忙時間再進行刪除舊資料的動作

表1:
inserttemp_bigtable_loggin_deltemp_bigtable_loggin_pre temp_bigtable_nologgin_deltemp_bigtable_nologgin_pre
temporary delete rows15404960   
temporary delete rows(nologging)  14662044 
temporary preserve rows 14661500  
temporary preserve rows(nologging)   14665460


表2:
insert    
standard logging (沒有使用append)213659940   
standard nologging(沒有使用append) 213794164  
standard logging(有使用append)  207505980 
standard nologging(有使用append)   207553024

表3:
delete    
test_bigtable(delete log)1214751564   
test_bigtable(delete nolog) 1216271016  
test_bigtable(truncate log)  152204 
test_bigtable(truncate nolog)   151432


建立一個 view 方便查尋現在的 session 產生的 redo log
create or replace view redo_size as select value from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';


相關的 table script

測試用的 table 跟資料量
CREATE TABLE BIGTABLE
(
  STATISTIC#  NUMBER,
  NAME        VARCHAR2(64 BYTE),
  CLASS       NUMBER,
  VALUE       NUMBER
);

table size = 199M
row size = 4374528


temporary 相關的 table 的 script
CREATE GLOBAL TEMPORARY TABLE TEMP_BIGTABLE_LOGGIN_DEL
(
  STATISTIC#  NUMBER,
  NAME        VARCHAR2(64 BYTE),
  CLASS       NUMBER,
  VALUE       NUMBER
)
ON COMMIT DELETE ROWS
NOCACHE;



CREATE GLOBAL TEMPORARY TABLE TEMP_BIGTABLE_LOGGIN_PRE
(
  STATISTIC#  NUMBER,
  NAME        VARCHAR2(64 BYTE),
  CLASS       NUMBER,
  VALUE       NUMBER
)
ON COMMIT PRESERVE ROWS
NOCACHE;



CREATE GLOBAL TEMPORARY TABLE TEMP_BIGTABLE_NOLOGGIN_DEL
(
  STATISTIC#  NUMBER,
  NAME        VARCHAR2(64 BYTE),
  CLASS       NUMBER,
  VALUE       NUMBER
)
ON COMMIT DELETE ROWS
NOCACHE;



CREATE GLOBAL TEMPORARY TABLE TEMP_BIGTABLE_NOLOGGIN_PRE
(
  STATISTIC#  NUMBER,
  NAME        VARCHAR2(64 BYTE),
  CLASS       NUMBER,
  VALUE       NUMBER
)
ON COMMIT PRESERVE ROWS
NOCACHE;


測試流程:
1、先查現在的 redo_size 量
2、執行所要的動作
3、再查尋動作後的 redo_size 量
4、commit
5、再查現在的 redo_size 量

其中一個測試記錄:
SQL> select * from redo_size;

     VALUE
----------
         0

SQL> insert into temp_bigtable_loggin_del select * from bigtable;

4374528 rows inserted

SQL> select * from redo_size;

     VALUE
----------
  15404848

SQL> commit;

Commit complete

SQL> select * from redo_size;

     VALUE
----------
  15404960
 
SQL> select count(*) from temp_bigtable_loggin_del;

  COUNT(*)
----------
         0

SQL> select * from redo_size;

     VALUE
----------
  15404960

Posted by my_work at 樂多Roodo! │15:27 │回應(0)引用(0)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/4991005