我們都知道在Oracle中每條SQL語句在執行之前都需要經過解析,這裡面又分為軟解析和硬解析。在Oracle中存在兩種類型的SQL語句,一類為 DDL語句(資料定義語言 (Data Definition Language)),他們是從來不會共用使用的,也就是每次執行都需要進行硬解析。還有一類就是DML語句(資料操縱語言),他們會根據情況選擇要麼進行硬解析,要麼進行軟解析。
DML:INSERT,UPDATE,DELETE,SELECT
DDL:CREATE,DROP,ALTER
一. SQL 解析過程
Oracle對此SQL將進行幾個步驟的處理過程:
1、語法檢查(syntax check): 檢查此sql的拼字是否文法。
2、語義檢查(semantic check): 諸如檢查sql語句中的訪問對象是否存在及該使用者是否具備相應的許可權。
3、對sql語句進行解析(prase): 利用內部演算法對sql進行解析,產生解析樹(parse tree)及執行計畫(execution plan)。
4、執行sql,返回結果(execute and return)
二. 解析過程詳解
2.1 文法檢測
判斷一條SQL語句的文法是否符合SQL的規範,比如執行:
SQL> selet * from emp;
我們就可以看出由於Select關鍵字少了一個“c”,這條語句就無法通過文法檢驗的步驟了。
2.2 語義檢查
文法正確的SQL語句在解析的第二個步驟就是判斷該SQL語句所訪問的表及列是否準確?使用者是否有許可權訪問或更改相應的表或列? 比如如下語句:
SQL> select * from emp;
select * from emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
由於查詢使用者沒有可供訪問的emp對象,因此該SQL語句無法通過語義檢查。
2.3 解析(Parse)
2.3.1 Parse主要分為三種:
1、Hard Parse (硬解析)
2、Soft Parse (軟解析)
3、Soft Soft Parse(好像有些資料中並沒有將這個算在其中)
Hard Parse: 就是上面提到的對提交的Sql完全重新從頭進行解析(當在Shared Pool中找不到時候將會進行此操作),總共有一下5個執行步驟:
1:文法分析
2:許可權與對象檢查
3: 在共用池中檢查是否有完全相同的之前完全解析好的. 如果存在,直接跳過4和5,運行Sql, 此時算soft parse.
4:選擇執行計畫
5:產生執行計畫
註:建立解析樹、產生執行計畫對於sql的執行來說是開銷昂貴的動作,所以,應當極力避免硬解析,盡量使用軟解析。這就是在很多項目中,倡導開發設計人員對功能相同的代碼要努力保持代碼的一致性,以及要在程式中多使用綁定變數的原因。
Soft Parse: 就如果是在Shared Pool中找到了與之完全相同的Sql解析好的結果後會跳過Hard Parse中的後面的兩個步驟。
Soft Soft Parse: 實際上是當設定了session_cursor_cache這個參數之後,Cursor被直接Cache在當前Session的PGA中的,在解析的時候只需要對其文法分析、權限物件分析之後就可以轉到PGA中尋找了,如果發現完全相同的Cursor,就可以直接去取結果了,也就就是實現了 Soft Soft Parse.