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)
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:
表2:
表3:
建立一個 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 跟資料量
temporary 相關的 table 的 script
測試流程:
1、先查現在的 redo_size 量
2、執行所要的動作
3、再查尋動作後的 redo_size 量
4、commit
5、再查現在的 redo_size 量
其中一個測試記錄:
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:
| insert | temp_bigtable_loggin_del | temp_bigtable_loggin_pre | temp_bigtable_nologgin_del | temp_bigtable_nologgin_pre |
| temporary delete rows | 15404960 | |||
| 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 |
引用URL
http://cgi.blog.roodo.com/trackback/4991005