天天看點

Oracle SQL語句執行步驟

Oracle中SQL語句執行過程中,Oracle内部解析原理如下:

1、當一使用者第一次送出一個SQL表達式時,Oracle會将這SQL進行Hard parse,這過程有點像程式編譯,檢查文法、表名、字段名等相關資訊(如下圖),這過程會花比較長的時間,因為它要分析語句的文法與語義。然後獲得最優化後的執行計劃(sql plan),并在記憶體中配置設定一定的空間儲存該語句與對應的執行計劃等資訊。

2、當使用者第二次請求或多次請求時,Oracle會自動找到先前的語句與執行計劃,而不會進行Hard parse,而是直接進行Soft parse(把語句對應的執行計劃調出,然後執行),進而減少資料庫的分析時間。

注意的是:Oracle中隻能完全相同的語句,包大小寫、空格、換行都要求一樣時,才會重複使用以前的分析結果與執行計劃。

分析過程如下圖:

Oracle SQL語句執行步驟

對于大量的、頻繁通路的SQL語句,如果不采用Bind 變量的方式,哪Oracle會花費大量的Shared latch與CPU在做Hard parse處理,是以,要盡量提高語句的重用率,減少語句的分析時間,通過了解Oracle SQL語句的分析過程可以明白Oracle的内部處理邏輯,并在設計與實作上避免。

在用JDBC或其它持久化資料(如Hibernate,JDO等)操作時,盡量用占位符(?)

ORACLE sql 的處理過程大緻如下:

1.運用HASH算法,得到一個HASH值,這個值可以通過V$SQLAREA.HASH_VALUE 檢視

2.到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,則無需硬解析,進行軟解析

3.如果shared pool不存在此HASH值,則進行文法檢查,檢視是否有文法錯誤

4.如果沒有文法錯誤,就進行語義檢查,檢查該SQL引用的對象是否存在,該使用者是否具有通路該對象的權限

5.如果沒有語義錯誤,對該SQL進行解析,生成解析樹,執行計劃

6.生成ORACLE能運作的二進制代碼,運作該代碼并且傳回結果給使用者

硬解析和軟解析都在第5步進行

硬解析通常是昂貴的操作,大約占整個SQL執行的70%左右的時間,硬解析會生成執行樹,執行計劃,等等。

當再次執行同一條SQL語句的時候,由于發現library cache中有相同的HASH值,這個時候不會硬解析,而會軟解析,

那麼軟解析究竟是幹了什麼呢?其實軟解析就是跳過了生成解析樹,生成執行計劃這個耗時又耗CPU的操作,直接利用生成的執行計劃運作

該SQL語句。

下面摘抄eygle深入解析ORACLE 中關于SQL執行過程的描述

  1.首先獲得library cache latch,根據SQL的HASH_VALUE在library cache中查找是否存在此HASH_VALUE,如果找到這個HASH_VALUE,稱之為軟解析,Server獲得改SQL執行計劃轉向第4步,如果找不到共享代碼就進行硬解析。

  2.釋放library pool cache,獲得shared pool latch,查找并鎖定自由空間(在bucket 中查找chunk)。如果找不到,報ORA-04031錯誤

  3.釋放shared pool latch,重新獲得library cache latch,将SQL執行計劃放入library cache中。

  4.釋放library cache latch,保持null模式的library cache pin/lock.

  5.開始執行。

Library cache latch可以了解為硬/軟解析的時候發生的,因為解析的時候會搜尋library cache,是以會産生library cache latch

Library cache pin 是在執行的階段發生的。