問題一:哪個進(jìn)程負(fù)責(zé)硬解析?shared pool設(shè)置不合理除了命中率低外還有哪些現(xiàn)象?


     說到軟解析(soft prase)和硬解析(hard prase),就不能不說一下Oraclesql的處理過程。當(dāng)你發(fā)出一條sql語句交付Oracle,在執(zhí)行和獲取結(jié)果前,Oracle對此sql將進(jìn)行幾個步驟的處理過程:

    1、語法檢查(syntax check)

    檢查此sql的拼寫是否語法。

    2、語義檢查(semantic check)

    諸如檢查sql語句中的訪問對象是否存在及該用戶是否具備相應(yīng)的權(quán)限。

    3、對sql語句進(jìn)行解析(prase)

    利用內(nèi)部算法對sql進(jìn)行解析,生成解析樹(parse tree)及執(zhí)行計劃(execution plan)。

    4、執(zhí)行sql,返回結(jié)果(execute and return)

    其中,軟、硬解析就發(fā)生在第三個過程里。

    Oracle利用內(nèi)部的hash算法來取得該sql的hash值,然后在library cache里查找是否存在該hash值;

    假設(shè)存在,則將此sql與cache中的進(jìn)行比較;

    假設(shè)“相同”,就將利用已有的解析樹與執(zhí)行計劃,而省略了優(yōu)化器的相關(guān)工作。這也就是軟解析的過程。

    誠然,如果上面的2個假設(shè)中任有一個不成立,那么優(yōu)化器都將進(jìn)行創(chuàng)建解析樹、生成執(zhí)行計劃的動作。這個過程就叫硬解析。

    創(chuàng)建解析樹、生成執(zhí)行計劃對于sql的執(zhí)行來說是開銷昂貴的動作,所以,應(yīng)當(dāng)極力避免硬解析,盡量使用軟解析。

    這就是在很多項(xiàng)目中,倡導(dǎo)開發(fā)設(shè)計人員對功能相同的代碼要努力保持代碼的一致性,以及要在程序中多使用綁定變量的原因。

    /****************************************************/

    問題二、大家都在說在Sql中使用了Bind Var(綁定變量)會提高不少性能,那他到底是如何提高性能的呢?

    使用了Bind Var能提高性能主要是因?yàn)檫@樣做可以盡量避免不必要的硬分析(Hard Parse)而節(jié)約了時間,同時節(jié)約了大量的CPU資源。

    當(dāng)一個Client提交一條Sql給Oracle后,Oracle 首先會對其進(jìn)行解析(Parse),然后將解析結(jié)果提交給優(yōu)化器(Optimiser)來進(jìn)行優(yōu)化而取得Oracle認(rèn)為的最優(yōu)的Query Plan,然后再按照這個最優(yōu)的Plan來執(zhí)行這個Sql語句(當(dāng)然在這之中如果只需要軟解析的話會少部分步驟)。

    但是,當(dāng)Oracle接到 Client提交的Sql后會首先在共享池(Shared Pool)里面去查找是否有之前已經(jīng)解析好的與剛接到的這一個Sql完全相同的Sql(注意這里說的是完全相同,既要求語句上的字符級別的完全相同,又要求涉及的對象也必須完全相同)。當(dāng)發(fā)現(xiàn)有相同的以后解析器就不再對新的Sql在此解析而直接用之前解析好的結(jié)果了。這里就節(jié)約了解析時間以及解析時候消耗的CPU資源。尤其是在OLTP中運(yùn)行著的大量的短小Sql,效果就會比較明顯了。因?yàn)橐粭l兩條Sql的時間可能不會有多少感覺,但是當(dāng)量大了以后就會有比較明顯的感覺了。

    上面說到了硬解析(Hard Parse),那這個Hard Parse到底是個啥呢?

    Parse主要分為三種:

    1、Hard Parse (硬解析)

    2、Soft Parse (軟解析)

    3、Soft Soft Parse(好像有些資料中并沒有將這個算在其中)

    Hard Parse就是上面提到的對提交的Sql完全重新從頭進(jìn)行解析(當(dāng)在Shared Pool中找不到時候?qū)M(jìn)行此操作),總共有一下5個執(zhí)行步驟:

    1:語法分析

    2:權(quán)限與對象檢查

    3:在共享池中檢查是否有完全相同的之前完全解析好的—如果存在,直接跳過4和5,運(yùn)行Sql(此時算soft parse)

    4:選擇執(zhí)行計劃

    5:產(chǎn)生執(zhí)行計劃

    Soft Parse就如果是在Shared Pool中找到了與之完全相同的Sql解析好的結(jié)果后會跳過Hard Parse中的后面的兩個步驟。

    Soft Soft Parse實(shí)際上是當(dāng)設(shè)置了session_cursor_cache這個參數(shù)之后,Cursor被直接Cache在當(dāng)前Session的PGA中的,在解析的時候只需要對其語法分析、權(quán)限對象分析之后就可以轉(zhuǎn)到PGA中查找了,如果發(fā)現(xiàn)完全相同的Cursor,就可以直接去取結(jié)果了,也就就是實(shí)現(xiàn)了 Soft Soft Parse.

    不過在計算解析次數(shù)的時候是只計算Hard Parse和Soft Parse的(其實(shí)Soft Soft Parse好像也并不能算是做了Parse  ):Soft Parse百分比計算:Round(100*(1-:hprs/:prse),2) [hprs:硬解析次數(shù);prse:解析次數(shù)] Parse比率計算: Round(100*(1-prse/exec) ,2) [exec:執(zhí)行次數(shù)]