Oracle SQL語句執行步驟
轉自:http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762345.html
Oracle中SQL語句執行過程中,Oracle內部解析原理如下:
1、當一使用者第一次提交一個SQL表示式時,Oracle會將這SQL進行Hard parse,這過程有點像程式編譯,檢查語法、表名、欄位名等相關資訊(如下圖),這過程會花比較長的時間,因為它要分析語句的語法與語義。然後獲得最最佳化後的執行計劃(sql plan),並在記憶體中分配一定的空間儲存該語句與對應的執行計劃等資訊。
2、當使用者第二次請求或多次請求時,Oracle會自動找到先前的語句與執行計劃,而不會進行Hard parse,而是直接進行Soft parse(把語句對應的執行計劃調出,然後執行),從而減少資料庫的分析時間。
注意的是:Oracle中只能完全相同的語句,包大小寫、空格、換行都要求一樣時,才會重複使用以前的分析結果與執行計劃。
分析過程如下圖:
對於大量的、頻繁訪問的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 是在執行的階段發生的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28612416/viewspace-764587/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中SQL語句解析的步驟OracleSQL
- Oracle中SQL語句解析的步驟(轉)OracleSQL
- 優化 SQL 語句的步驟優化SQL
- 後臺執行SQL語句(oracle)SQLOracle
- Oracle SQL 語句的執行過程OracleSQL
- java連線oracle執行sql語句JavaOracleSQL
- 查詢Oracle正在執行的SQL語句OracleSQL
- 理解oracle執行sql語句的過程OracleSQL
- oracle 對比sql語句執行環境OracleSQL
- sql語句批量執行SQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- sql語句如何執行的SQL
- SQL語句執行順序SQL
- 執行大的sql語句SQL
- toad執行sql語句SQL
- SQL Server SQL語句執行順序SQLServer
- oracle常用後臺程序及sql語句執行流程OracleSQL
- oracle 中如何顯示sql語句的執行時間和sql語句的執行後的當前時間OracleSQL
- mysql執行sql語句過程MySql
- Mybatis 動態執行SQL語句MyBatisSQL
- mysql的sql語句執行流程MySql
- sql語句執行緩慢分析SQL
- SQL 語句的執行順序SQL
- Hibernate 執行原始SQL語句SQL
- 【SQL】Oracle sql語句 minus函式執行效率與join對比SQLOracle函式
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- Oracle SQL語句執行流程與順序原理解析OracleSQL
- Oracle 查詢某個session正在執行的sql語句OracleSessionSQL
- 檢視當前oracle中正在執行的sql語句OracleSQL
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- Oracle 行轉列的sql語句OracleSQL
- Laravel 獲取執行的sql語句LaravelSQL
- MySQL cron定時執行SQL語句MySql