Oracle SQL語句執行步驟


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

1、當一用戶第一次提交一個SQL表達式時,Oracle會將這SQL進行Hard parse,這過程有點像程序編譯,檢查語法、表名、字段名等相關信息(如下圖),這過程會花比較長的時間,因為它要分析語句的語法與語義。然后獲得最優化后的執行計划(sql plan),並在內存中分配一定的空間保存該語句與對應的執行計划等信息。

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

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

分析過程如下圖:

clip_image001

對於大量的、頻繁訪問的SQL語句,如果不采用Bind 變量的方式,哪Oracle會花費大量的Shared latchCPU在做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,根據SQLHASH_VALUElibrary 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
是在執行的階段發生的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM