SQL執行計劃分析

zhanglincon發表於2009-04-27
select 的工作原理:
1:Parse,語法分析階段
2:Execute,執行
3:Fetch,提取資料階段

一:先在Library Cache找這條命令,看執行計劃,
二:如果沒有,就語法分析
三:如果語法通過,就物件分析,通過資料字典
       比如表存不存在,表列存不存在,表列如果是*,就翻譯成全部列名
四:獲得物件解析鎖,鎖住表,列這個物件,目的是防止別的使用者來改變表,列結構。
五:檢查許可權物件,看使用者能不能訪問這個物件。比如表,檢視。
六:伺服器生成執行計劃,裝載到Library Cache中
七:檢查資料庫快取記憶體區(Data buffer)中,有沒有內容,即看能不能找到物件(表,檢視)的資料塊(block),如果有,就返回
八:如果不存在,由伺服器程式,把表塊讀取到Data Buffer中
九:把Data Buffer中的資料提取出來,

update語句分析:
1:Parse階段
2:Execute階段

一:先在Library Cache找這條命令,看執行計劃,
二:如果沒有,就語法分析
三:如果語法通過,就物件分析,通過資料字典
       比如表存不存在,表列存不存在
四:獲得物件解析鎖,鎖住表,列這個物件,目的是防止別的使用者來改變表,列結構。
五:檢查許可權物件,看使用者能不能訪問這個物件。比如表,檢視。
六:伺服器生成執行計劃,裝載到Library Cache中

七:檢查資料庫快取記憶體區(Data buffer)中,要修改的內容的行(資料塊)存不存在,如果存在,就修改
八:如果不存在,由伺服器程式,把表塊讀取到Data Buffer中
九:給被修改的行加鎖,以防止其它使用者對物件(表)的結構進行修改。
十:舊資料放到Undo buffer(回滾段)中,新資料寫時去,這個改變狀態記錄到Redo Logo中(Redo 日誌/重做日誌)

刪除(DELETE)
1.Oracle讀Block到Buffer Cache(如果該Block在Buffer中不存在)
2.在redo log buffer中記錄delete操作的細節
3.在相應回滾段段頭的事務表中建立一個undo條目
4.把將要刪除的記錄建立前映象,存放到Undo Block中
5.在Buffer Cache中的相應資料塊上刪除記錄,並且標記相應的資料塊為Dirty


提交(COMMIT)
1.Oracle產生一個SCN
2.在回滾段事務表中標記該事務狀態為commited
3.LGWR Flush Log Buffer到日誌檔案
3.如果此時資料塊仍然在Buffer Cache中,那麼SCN將被記錄到Block Header上,這被稱為快速提交(fast commit)
4.如果dirty block已經被寫回到磁碟,那麼下一個訪問這個block的程式將會自回滾段中獲取該事務的狀態,確認該事務被提交。然後這個程式獲得提交SCN並寫回到Block Header上。這被稱為延遲塊清除(delayed block cleanout)。

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

相關文章