update的内部原理
1、sqlplus user/passwd@orcl
2、update t set a=1 where b='ss';
3、commit;
4、exit
1、sqlplus user/passwd@orcl
(1)、客戶端SQLPLUS連接監聽
(2)、監聽收到連接請求,Fork一個Oracle進程,作為服務器進程,同時分配一小塊PGA內存。
(3)、服務器進程和客戶端建立連接。
(4)、服務器進程(以下簡稱進程)查詢USER$、PROFILE$等數據字典,校驗用戶是否可以登錄。
(5)、如果可以登錄,連接創建完成。
2、update t set a=1 where b='ss';
(一)、如果B列上無索引
(1)、查詢SEG$等數據字典,找到T表段頭
(2)、從段頭讀出Extent Map,開始全掃描
(3)、找到第一個滿足條件的行,進行修改
(4)、查找同一塊中剩下的行,先構造一個CR塊,在CR塊中繼續查找,如果又找到滿足條件的行,在Xcur塊中修改。
(二)、如果B列上有索引,且版本不是11GR1(10G、11GR2),則不需要構造CR塊
(三)、B列無論是否有索引,在11GR1下都需要構造CR塊。
(四)、如果A列上有索引,增加索引維護步驟:
(1)、先在原索引塊中刪除要修改的原值
(2)、再將新值插入
(五)、任何塊的修改,都有以下步驟(非IMU)
(1)、在PGA中生成UNDO段頭事務表的后映像(5.2)
(2)、在PGA中生成UNDO塊的后映像(5.1)
(3)、在PGA中生成DataBlock塊的后映像(11.9)
(4)、將前三個Redo矢量做為一條Redo Recorder寫入Log buffer
(5)、修改UNDO段頭的事務表,事務正式開始。
(6)、修改UNDO塊,寫入DataBlock的前映像。
(7)、修改DataBlock,將新值“1”寫入Buffer cache。
(六)、任何塊的修改,都有以下步驟(IMU)
(1)、在PGA中生成DataBlock塊的后映像(11.9)
(2)、在PGA中生成UNDO段頭事務表的后映像(5.2)
(3)、在PGA中生成UNDO塊的后映像(5.1)
(4)、將前三個Redo矢量做為一條Redo Recorder寫入Shared pool中的Private strand。
(5)、將DataBlock中的前映像值,寫入Shared pool中的Imu pool。
(6)、修改UNDO段頭的事務表。
(7)、修改UNDO塊,寫入DataBlock的前映像。
(8)、修改DataBlock,將新值“1”寫入Buffer cache。
3、commit;
(一)、非IMU下(按最常見的快速提交):
(1)、在PGA中生成Commit的Redo 信息(編號5.4),另做為一條Redo recorder,寫入Log buffer
(2)、修改事務表相應Slot,聲明事務已提交。
(3)、修改DataBlock,在ITL Slot中寫入快速提交標志和SCN。每行上的行鎖不清0。
(4)、通知Lgwr,將Log buffer寫入Redo file。
(5)、收到Lgwr通知,寫入完成。
(6)、向用戶發收提交完成信息。
(一)、IMU下(按最常見的快速提交):
(1)、在PGA中生成Commit的Redo 信息(編號5.4),傳入Shared pool中的Private strand,追加在事務之前的Redo recorder之后。
(2)、修改事務表相應Slot,聲明事務已提交。
(3)、修改DataBlock,在ITL Slot中寫入快速提交標志和SCN。每行上的行鎖不清0。
(4)、將Private Strand中的Redo數據寫入Log buffer。
(5)、通知Lgwr,將Log buffer寫入Redo file。
(6)、收到Lgwr通知,寫入完成。
(7)、向用戶發收提交完成信息。
4、exit
(1)、斷開連接,中止服務器進程,釋放PGA
只是個提綱,沒有鎖、Latch、Mutex等
也不是太完善,SQL解析部分沒怎么提
update A where id=1;
update A where id=2;
commit;
非IMU下:
----------------第一條Redo recoder 開始-----------------
事務開始
update A where id=1對應UNDO的Redo
update A where id=1對應數據塊的Redo
----------------第一條Redo recoder 結束-----------------
----------------第二條Redo recoder 開始-----------------
update A where id=2對應UNDO的Redo
update A where id=2對應數據塊的Redo
----------------第二條Redo recoder 結束-----------------
----------------第三條Redo recoder 開始-----------------
Commit 事務結束
----------------第三條Redo recoder 結束-----------------
在非IMU下,一共會生成3條Redo recoder,也就是redo entries會增加3。
而在IMU下,是這樣的:
----------------第一條Redo recoder 開始-----------------
update A where id=1對應數據塊的Redo
事務開始
update A where id=2對應數據塊的Redo
Commit 事務結束
update A where id=1對應UNDO的Redo
update A where id=2對應UNDO的Redo
----------------第一條Redo recoder 結束-----------------
**********本博客所有內容均為原創,如有轉載請注明作者和出處!!!**********
Name: ? ?guoyJoe
QQ: ? ? ? ?252803295
Email: ? ?oracledba_cn@hotmail.com
Blog: ? ? ?http://blog.csdn.net/guoyJoe
ITPUB: ??http://www.itpub.net/space-uid-28460966.html
OCM: ? ??http://education.oracle.com/education/otn/YGuo.HTM
?_____________________________________________________________
加群驗證問題:哪些SGA結構是必需的,哪些是可選的?否則拒絕申請!!!
答案在:http://blog.csdn.net/guoyjoe/article/details/8624392
Oracle@Paradise 總群:127149411
Oracle@Paradise No.1群:177089463(已滿)
Oracle@Paradise No.2群:121341761
Oracle@Paradise No.3群:140856036
轉載于:https://blog.51cto.com/guoyjoe/1429077
總結
以上是生活随笔為你收集整理的update的内部原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新书上市:《FLUENT 14.0超级学
- 下一篇: 1815. 计算两点间的距离