剖析SQL語句的執行過程

dayong2015發表於2014-06-06

在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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章