剖析SQL語句的執行過程
在Oracle資料庫系統架構下,SQL語句由使用者程式產生,然後傳到相對應的伺服器端程式,之後由伺服器程式執行該SQL語句,如果是select語句,伺服器程式還需要將執行結果傳給使用者程式。
SQL語句的執行過程一般如下:
解析(PARSE)—— 繫結(BIND)——執行(EXECUTE)——提取(FETCH 只有SELECT才需要這步)
透過一條select語句大致解析過程:
客戶端輸入一條select語句,用戶程式通過網路傳輸送入shared pool,shared pool中的server process程式接收這條select語句,server process首先會檢測shared pool中是否快取該sql語句和相應的執行計劃,如果沒有,那麼server process將使用者輸入的sql語句轉化為ASSIC值,然後根據hash函式計算出其對應的hash值,server process將計算出的hash值去library cache中找到對應的鏈,然後遍歷chunk是否存在。
1.如果不存在,獲得shared pool latch(共享鎖),然後在shared pool中的可用chunk連結串列上找到一個chunk,之後釋放shared pool latch,接下來,就是進行硬解析過程,步驟如下:
1)對sql語句進行語法檢查,如果有,退出解析。
2)對資料字典裡校驗sql語句涉及的物件和列是否存在。如果不存在,則退出解析過程。這個過程會載入data dictionary cache(資料字典快取)。
3)將物件進行名稱轉化。比如將同義詞翻譯成實際的物件等。如果轉化失敗,退出解析。
4)檢查發出sql語句的使用者是否具有訪問sql語句裡所引用物件的許可權。若沒有,退出解析。
5)透過最佳化器建立一個最優的執行計劃。這個過程會根據資料字典記錄的物件的統計資訊,來計算最優的執行計劃。這是最耗CPU資源的。
6)將遊標所產生的執行計劃、SQL檔案等裝載進library cache的heap(堆疊)中。
2.如果在shared pool的鏈上找到了對應的chunk,則說明該sql語句之前執行過,於是進行軟解析,步驟如下:
1)server process將之前計算出的hash值送入DB cache中是否有該sql語句的緩衝資料塊。
2)如果找到了對應鏈上的chunk,那麼server process會將之前快取的執行結果返回給前臺使用者。
如果沒有找到對應鏈上的chunk,會去磁碟中取資料,然後先將資料快取在DB cache中,然後server process將DB cache中快取的結果輸出到前臺使用者。
現透過其他DML語句,如update語句的解析過程,如下:
此處只分析執行update語句和執行select語句的一些不同之處:
1.當一條update語句被server process送入DB cache中,找到了其對應鏈後會獲得cache buffers chains閂鎖來保護hash鏈的資料結構(會一直佔有此閂鎖,直到該會話執行了commit或rollback)。如果沒有足夠多的DB cache空間,LRU鏈會透過TCH計數器來判斷某個資料塊是否為熱塊,當會話在LRU鏈上分配快取時,先從LRU鏈的冷端開始查詢,如果查到某個非髒的緩衝區是熱塊(根據TCH值的高低判斷是否為熱塊),就會跳過這個熱塊繼續向下查詢,知道分配DB cache空間。(在commit或rollback之前,更新之前的資料會存放於undo表空間,預設儲存900秒)
2.對DB cache中資料執行完更新操作後,將操作成功的結果返回給使用者。當DB cache空間不足時,DBWR程式會將緩衝區中的髒資料寫入磁碟,然後釋放空間。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29634949/viewspace-1177184/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 10_SQL語句執行過程剖析SQL
- CoreData執行過程的sql語句SQL
- Oracle SQL 語句的執行過程OracleSQL
- mysql執行sql語句過程MySql
- 一條sql語句的執行過程SQL
- 淺談SQL語句的執行過程SQL
- 理解oracle執行sql語句的過程OracleSQL
- SQL語句執行過程詳解SQL
- sql語句執行過程小結SQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- MySQL探祕(二):SQL語句執行過程詳解MySql
- [20170703]SQL語句分析執行過程.txtSQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- MySQL全文索引原始碼剖析之Insert語句執行過程MySql索引原始碼
- MySQL系列之一條SQL查詢語句的執行過程MySql
- PostgreSQL的insert語句執行過程分析SQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- SQL語句的處理過程SQL
- sql語句如何執行的SQL
- 執行大的sql語句SQL
- MySQL SQL語句查詢執行過程的四個階段介紹MySql
- Entity Framework Code First執行SQL語句、檢視及儲存過程FrameworkSQL儲存過程
- sql語句批量執行SQL
- MySQL 查詢語句執行過程淺析MySql
- [zebra原始碼]分片語句ShardPreparedStatement執行過程原始碼
- SQL語句的處理過程修正SQL
- 由SQL語句執行過程觸發對Oracle體系結構的思考SQLOracle
- sql 執行過程SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- 15個常用sql語句 分支 迴圈 子查詢 儲存過程 事務 常用函式 sql語句執行過程(轉載備用)SQL儲存過程函式
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 一條SQL語句的優化過程SQL優化