剖析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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql執行sql語句過程MySql
- 一條sql語句的執行過程SQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- MySQL探祕(二):SQL語句執行過程詳解MySql
- MySQL全文索引原始碼剖析之Insert語句執行過程MySql索引原始碼
- MySQL系列之一條SQL查詢語句的執行過程MySql
- PostgreSQL的insert語句執行過程分析SQL
- sql語句如何執行的SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- MySQL 查詢語句執行過程淺析MySql
- [zebra原始碼]分片語句ShardPreparedStatement執行過程原始碼
- SQL語句執行順序SQL
- Laravel 獲取執行的sql語句LaravelSQL
- sql語句執行緩慢分析SQL
- 後臺執行SQL語句(oracle)SQLOracle
- Mybatis 動態執行SQL語句MyBatisSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 一條Sql的執行過程SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL語句各子句的執行順序SQL
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 「分散式技術專題」剖析一個SQL的解析及執行過程分散式SQL
- MySQL cron定時執行SQL語句MySql
- java連線oracle執行sql語句JavaOracleSQL
- SQL 查詢語句的執行順序解析SQL
- 一條update SQL語句是如何執行的SQL
- python關於pymysql 執行sql語句in的用法PythonMySql
- 一條SQL更新語句是如何執行的SQL
- Hive SQL語句的正確執行順序HiveSQL
- 一條SQL更新語句是如何執行的?SQL
- EF中使用SQL語句或儲存過程SQL儲存過程
- 分析執行計劃優化SQLSQL語句處理的過程(轉)優化SQL
- 一條更新的SQL語句是如何執行的?SQL
- [20181119]sql語句執行緩慢分析.txtSQL
- mysql sql語句執行超時設定MySql
- Mybatis原始碼解析之執行SQL語句MyBatis原始碼SQL