SQL------軟解析和硬解析


本文轉載自:https://blog.csdn.net/holandstone/article/details/50108501

提到軟解析(soft prase)和硬解析(hard prase),就不能不說一下Oracle對sql的處理過程。當你發出一條sql語句交付Oracle,在執行和獲取結果前,Oracle對此sql將進行幾個步驟的處理過程:
1、語法檢查(syntax check)
檢查此sql的拼寫是否語法。
2、語義檢查(semantic check)
諸如檢查sql語句中的訪問對象是否存在及該用戶是否具備相應的權限。
3、對sql語句進行解析(prase)
利用內部算法對sql進行解析,生成解析樹(parse tree)及執行計划(execution plan)。
4、執行sql,返回結果(execute and return)

其中,軟、硬解析就發生在第三個過程里。
Oracle利用內部的hash算法來取得該sql的hash值,然后在library cache里查找是否存在該hash值;
假設存在,則將此sql與cache中的進行比較;
假設“相同”,就將利用已有的解析樹與執行計划,而省略了優化器的相關工作。這也就是軟解析的過程。
誠然,如果上面的2個假設中任有一個不成立,那么優化器都將進行創建解析樹、生成執行計划的動作。這個過程就叫硬解析。

創建解析樹、生成執行計划對於sql的執行來說是開銷昂貴的動作,所以,應當極力避免硬解析,盡量使用軟解析。
這就是在很多項目中,倡導開發設計人員對功能相同的代碼要努力保持代碼的一致性,以及要在程序中多使用綁定變量的原因。當客戶端進程,將SQL語句通過監聽器發送到Oracle時, 會觸發一個Server process生成,來對該客戶進程服務。Server process得到SQL語句之后,對SQL語句進行Hash運算,然后根據Hash值到library cache中查找,如果存在,則直接將library cache中的緩存的執行計划拿來執行,最后將執行結果返回該客戶端,這種SQL解析叫做軟解析;如果不存在,則會對該SQL進行解析parse,然后執行,返回結果,這種SQL解析叫做硬解析。

1.硬解析的步驟
硬解析一般包括下面幾個過程:
1)對SQL語句進行語法檢查,看是否有語法錯誤。比如select from where 等的拼寫錯誤,如果存在語法錯誤,則推出解析過程;
2)通過數據字典(row cache),檢查SQL語句中涉及的對象和列是否存在。如果不存在,則推出解析過程。
3)檢查SQL語句的用戶是否對涉及到的對象是否有權限。如果沒有則推出解析;
4)通過優化器創建一個最優的執行計划。這個過程會根據數據字典中的對象的統計信息,來計算多個執行計划的cost,從而得到一個最優的執行計划。這一步涉及到大量的數據運算,從而會消耗大量的CPU資源;(library cache最主要的目的就是通過軟解析來減少這個步驟);
5)將該游標所產生的執行計划,SQL文本等裝載進library cache中的heap中。

2.軟解析
所謂軟解析,就是因為相同文本的SQL語句存在於library cache中,所以本次SQL語句的解析就可以去掉硬解析中的一個活多個步驟。從而節省大量的資源的耗費。

 

一、Shared pool 作用:緩存SQL語句及SQL語句的執行計划 SQL語句執行三步:解析(parse)------執行(exec)------獲取數據(fetch)

shared pool的組成: 3塊區域:free、librarycache、row cache(dictionary cache) library cache:緩存SQL語句以及SQL語句的執行計划 dictionary cache:Oracle數據庫自身的信息(數據庫中有多少表、多少用戶、表有多少列、列名是什么、列的數據類型、每個表多大)存放在dictionary中

數據字典舉例:想知道數據庫中有沒有T1表 1、create table t1 as select * from dba_objects; 2、desc dba_tables; ---------------數據字典信息表 3、select table_name,owner from dba_tables where table_name like 'T1%’; 所有數據字典信息可在官方文檔中查找booksàreferenceàdba_tables

1、查看librarycache大小 select * from v$sgastat a where a.NAME = 'library cache'; 2、free空間大小 select * from v$sgastat a where a.pool = 'shared pool' anda.NAME = 'free memory'; 3、row cache空間大小 select * from v$sgastat a where a.NAME = 'row cache';

二、解析:(hard parse,soft parse) 硬解析步驟:1、server process判斷SQL語句語法是否有錯誤 2、查看SQL語句所涉及的對象是否存在(表是否存在等等) 3、執行SQL的用戶對對象是否有相應權限(系統權限、對象權限) 4、生成執行計划--------一條SQL語句有多種執行方案,在N中執行方案中挑選出最優的一個最優的執行方案作為這條SQL執行計划--------最消耗資源 軟解析:沒有上述第四步,僅僅是常規判斷

什么時候發生硬解析: Server process 拿着SQL語句在librarycache中找,如果這條SQL語句在library cache中沒有,說明這條SQL語句和他的執行計划在library cache中沒有-------硬解析 有--------軟解析 無論hard parse還是soft parse,解析過程中用到很多數據庫自身信息(權限信息、對象信息、對象統計信息------字典信息);即對SQL語句進行解析(軟硬)的時候,都要頻繁的訪問數據字典信息----------所以row cache放在shared pool和library cache在一起

軟硬解析的具體情況 select name,value from v$sysstat where name like 'parse%'

  六、總結

  1.盡可能的避免硬解析,因為硬解析需要更多的CPU資源,閂等。

  2.cursor_sharing參數應權衡利弊,需要考慮使用similar與force帶來的影響。

  3.盡可能的使用綁定變量來避免硬解析

我們都知道在Oracle中每條SQL語句在執行之前都需要經過解析,這里面又分為軟解析和硬解析。在Oracle中存在兩種類型的SQL語句,一類為 DDL語句(數據定義語言),他們是從來不會共享使用的,也就是每次執行都需要進行硬解析。還有一類就是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. 


免責聲明!

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



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