oracle commit的時候究竟發生了什麼

rainbowbridg發表於2012-03-06

commit究竟發生了什麼,其實很少的事情需要做

  • 把SCN號寫入日誌檔案
  • LGWN把剩餘的redo寫入日誌檔案
  • 所有locks被釋放掉
  • 進行塊清理。塊清理是指將,將儲存在這個block中的事務資訊清理掉
[@more@]

1.從理解LOGW什麼時候將redo log buffer中把redo寫入redo log file理解commit;

  • 當redo log buffer 三分之一滿的時候寫
  • 當commit的時候寫
  • 當發生日誌切換的時候寫
  • 當產生的redo滿1M的時候寫
  • 當DBWN要寫的時候,先寫redo
  • 每3秒寫

也就是說,redo是以一種相對連續的方式寫入日誌檔案的。所以不管一個事務產生了多少redo,其實commit的時候做的工作都差不多,因為大部門的redo已經寫入日誌檔案了

2.commit的時候發生了什麼

  • 把SCN號寫入日誌檔案
  • LGWN把剩餘的redo寫入日誌檔案
  • 所有locks被釋放掉
  • 進行塊清理。塊清理是指將,將儲存在這個block中的事務資訊清理掉。

所以實際上每次commit的時候做的工作都很少,最大的工作就是將redo寫入日誌檔案了,但是大部門redo已經寫入到日誌檔案了;但是這也不 代表,每次修改一個塊的時候,都要去commit,這樣會增加對日誌檔案的競爭(日誌檔案是個共享結構),同時也增加了對latches的競爭(保護對共 享結構的訪問)。所以應該根據邏輯事務的大小來決定什麼時候commit。

3.下面一個例子,產生不同大小的redo,來說明提交的時候,做的工作時間上差不多

s1:建立一個大表

  1. scott@WISON>create table t as select * from all_objects;
  2. Table created.
  3. scott@WISON>
s2:建立一個需要插入10行資料的表t_10,設定自動追蹤
  1. scott@WISON>create table t_10 as select * from t where 1=0;
  2. Table created.
  3. scott@WISON>set autotrace on statistics;
  4. scott@WISON>set timing on
  5. scott@WISON>insert into t_10 select * from t where rownum <=10;
  6. 10 rows created.
  7. Elapsed: 00:00:00.06 插入時間
  8. Statistics
  9. ----------------------------------------------------------
  10. 451 recursive calls
  11. 56 db block gets
  12. 337 consistent gets
  13. 1 physical reads
  14. 7284 redo size
  15. 919 bytes sent via SQL*Net to client
  16. 1018 bytes received via SQL*Net from client
  17. 4 SQL*Net roundtrips to/from client
  18. 2 sorts (memory)
  19. 0 sorts (disk)
  20. 10 rows processed
  21. scott@WISON>commit;
  22. Commit complete.
  23. Elapsed: 00:00:00.00
s3:插入1000行
  1. scott@WISON>insert into t_10 select * from t where rownum <=1000;
  2. 1000 rows created.
  3. Elapsed: 00:00:00.02
  4. Statistics
  5. ----------------------------------------------------------
  6. 39 recursive calls
  7. 143 db block gets
  8. 180 consistent gets
  9. 7 physical reads
  10. 104880 redo size
  11. 919 bytes sent via SQL*Net to client
  12. 1020 bytes received via SQL*Net from client
  13. 4 SQL*Net roundtrips to/from client
  14. 1 sorts (memory)
  15. 0 sorts (disk)
  16. 1000 rows processed
  17. scott@WISON>commit;
  18. Commit complete.
  19. Elapsed: 00:00:00.12
  20. scott@WISON>
插入10000行
  1. scott@WISON>insert into t_10 select * from t where rownum <=10000;
  2. 10000 rows created.
  3. Elapsed: 00:00:00.10
  4. Statistics
  5. ----------------------------------------------------------
  6. 487 recursive calls
  7. 1808 db block gets
  8. 596 consistent gets
  9. 121 physical reads
  10. 1102708 redo size
  11. 919 bytes sent via SQL*Net to client
  12. 1021 bytes received via SQL*Net from client
  13. 4 SQL*Net roundtrips to/from client
  14. 1 sorts (memory)
  15. 0 sorts (disk)
  16. 10000 rows processed
  17. scott@WISON>commit;
  18. Commit complete.
  19. Elapsed: 00:00:00.01
  20. scott@WISON>
發現,插入10行,1000行,10000行,commit的時間都很短。

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

相關文章