Oracle SQL語句執行步驟

2022-07-23 22:33:41 字數 1790 閱讀 4846

**:

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 將涉及...