**:
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 是在執行的階段發生的。
ORACLE SQL執行步驟
以前理解的 oracle sql 的處理過程大致如下 1.運用hash演算法,得到乙個hash值,這個值可以通過v sqlarea.hash value 檢視 2.到shared pool 中的 library cache 中查詢是否有相同的hash值,如果存在,則無需硬解析,進行軟解析 3.如果s...
將oracle SQL語句執行結果匯入文字檔案
將oracle sql語句執行結果匯入文字檔案 1 建立directory create or replace directory dir as d temp 為使用者賦予該directory的許可權 grant all on directroy dir to public 2 建立函式functi...
SQL語句的執行步驟
前幾天在這個問題上栽了,所以寫下來紀念一下 sql語句的執行步驟 一條sql語句的處理過程要經過以下幾個步驟。1 b 語法分析 b 分析語句的語法是否符合規範,衡量語句中各表示式的意義。2 b 語義分析 b 檢查語句中涉及的所有資料庫物件是否存在,且使用者有相應的許可權。3 b 檢視轉換 b 將涉及...