SQL執行計劃分析
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)。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql 執行計劃SQL
- Oracle檢視正在執行的SQL以及執行計劃分析OracleSQL
- Oracle sql執行計劃OracleSQL
- SQL Server執行計劃SQLServer
- SQL的執行計劃SQL
- MySQL——通過EXPLAIN分析SQL的執行計劃MySqlAI
- pl/sql developer 分析的執行計劃不可信SQLDeveloper
- 【sql調優之執行計劃】獲取執行計劃SQL
- explain執行計劃分析AI
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 檢視Oracle SQL執行計劃方法比較、分析OracleSQL
- 獲取SQL執行計劃SQL
- SQL 執行計劃案例1SQL
- 剖析SQL Server執行計劃SQLServer
- 檢視sql執行計劃SQL
- 分析執行計劃最佳化SQLORACLE的執行計劃(轉)SQLOracle
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- sql執行計劃是否改變SQL
- sql的執行計劃 詳解SQL
- sql執行計劃基本命令SQL
- SQL PROFILE修改固定執行計劃SQL
- 使用sql profile固定執行計劃SQL
- 通過分析SQL語句的執行計劃優化SQL(總結)SQL優化
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- Oracle中檢視已執行sql的執行計劃OracleSQL
- 透過10053事件分析一個SQL執行計劃事件SQL
- 使用SQL_TEACE的跟蹤檔案分析執行計劃SQL
- DB2執行計劃分析DB2
- SqlServer的執行計劃如何分析?SQLServer
- 【優化】ORACLE執行計劃分析優化Oracle
- 透過分析SQL語句的執行計劃最佳化SQL(總結)SQL
- 如何檢視SQL的執行計劃SQL
- 檢視SQL的執行計劃方法SQL
- Oracle 獲取SQL執行計劃方法OracleSQL
- baseline固定SQL執行計劃SQL
- 控制執行計劃之-SQL Profile(一)SQL
- 獲取SQL執行計劃的方式:SQL
- 使用PL/SQL檢視執行計劃SQL