oracle commit的時候究竟發生了什麼
commit究竟發生了什麼,其實很少的事情需要做
- 把SCN號寫入日誌檔案
- LGWN把剩餘的redo寫入日誌檔案
- 所有locks被釋放掉
- 進行塊清理。塊清理是指將,將儲存在這個block中的事務資訊清理掉
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:建立一個大表
- scott@WISON>create table t as select * from all_objects;
- Table created.
- scott@WISON>
- scott@WISON>create table t_10 as select * from t where 1=0;
- Table created.
- scott@WISON>set autotrace on statistics;
- scott@WISON>set timing on
- scott@WISON>insert into t_10 select * from t where rownum <=10;
- 10 rows created.
- Elapsed: 00:00:00.06 插入時間
- Statistics
- ----------------------------------------------------------
- 451 recursive calls
- 56 db block gets
- 337 consistent gets
- 1 physical reads
- 7284 redo size
- 919 bytes sent via SQL*Net to client
- 1018 bytes received via SQL*Net from client
- 4 SQL*Net roundtrips to/from client
- 2 sorts (memory)
- 0 sorts (disk)
- 10 rows processed
- scott@WISON>commit;
- Commit complete.
- Elapsed: 00:00:00.00
- scott@WISON>insert into t_10 select * from t where rownum <=1000;
- 1000 rows created.
- Elapsed: 00:00:00.02
- Statistics
- ----------------------------------------------------------
- 39 recursive calls
- 143 db block gets
- 180 consistent gets
- 7 physical reads
- 104880 redo size
- 919 bytes sent via SQL*Net to client
- 1020 bytes received via SQL*Net from client
- 4 SQL*Net roundtrips to/from client
- 1 sorts (memory)
- 0 sorts (disk)
- 1000 rows processed
- scott@WISON>commit;
- Commit complete.
- Elapsed: 00:00:00.12
- scott@WISON>
- scott@WISON>insert into t_10 select * from t where rownum <=10000;
- 10000 rows created.
- Elapsed: 00:00:00.10
- Statistics
- ----------------------------------------------------------
- 487 recursive calls
- 1808 db block gets
- 596 consistent gets
- 121 physical reads
- 1102708 redo size
- 919 bytes sent via SQL*Net to client
- 1021 bytes received via SQL*Net from client
- 4 SQL*Net roundtrips to/from client
- 1 sorts (memory)
- 0 sorts (disk)
- 10000 rows processed
- scott@WISON>commit;
- Commit complete.
- Elapsed: 00:00:00.01
- scott@WISON>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-1057513/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Django】runserver 0.0.0.0:0 後,究竟發生了什麼DjangoServer
- 當你開啟網頁的時候,世界都發生了什麼(1)網頁
- go func 時發生了什麼Go
- 當執行時,發生了什麼?
- [webpack]原始碼解讀:命令列輸入webpack的時候都發生了什麼?Web原始碼命令列
- Oracle10g RAC開啟關閉時候究竟在關閉什麼Oracle
- 啟動vue專案時發生了什麼Vue
- Oracle的commit做了什麼?OracleMIT
- K8S學習之當我們部署應用的時候都發生了什麼?K8S
- 遊戲的特質:當我們說“play”的時候,究竟在說什麼?遊戲
- 2021-2-28:呼叫 System.gc() 後究竟發生了什麼?GC
- 訪問網際網路時發生了什麼?
- Flutter入門與實戰(四十四):從原始碼分析setState 的時候到底發生了什麼?Flutter原始碼
- new Vue發生了什麼Vue
- 當 Redis 發生高延遲時,到底發生了什麼Redis
- C++中什麼時候用move,什麼時候用forward?C++Forward
- [譯文]請求一個URL時發生了什麼
- 當我們遊覽網頁的時候, 在輸入連結點選回車之後到看到新網頁這中間究竟發生了什麼?網頁
- mysql什麼時候會發生file sortMySql
- 裁員20%、用穩定幣發工資……這家加密交易所究竟發生了什麼?加密
- Oracle 什麼時候select會產生redo?Oracle
- 什麼時候釋出
- 什麼時候呼叫layoutSubviewsView
- session是什麼時候建立的Session
- kubelet 建立 Pod 前發生了什麼?
- 猜猜體育課發生了什麼?
- oracle 索引什麼時候重建和重建方法討論Oracle索引
- 什麼時候採用socket通訊,什麼時候採用http通訊HTTP
- 【揭祕】C語言型別轉換時發生了什麼?C語言型別
- Android在橫豎屏切換時到底發生了什麼?Android
- oracle 什麼時候才回收v$session 中status='KILLED'的程式OracleSession
- 新版什麼時候釋出?
- 什麼時候該用vuex?Vue
- 到底什麼時候使用mqMQ
- 什麼時候該用MongoDB?MongoDB
- 當你在瀏覽器輸入一個網址,回車後究竟發生了什麼?瀏覽器
- Python的類什麼時候用Python
- oracle commit提交到底作了什麼OracleMIT