資源描述:
《軟解析、硬解析、軟軟解析區(qū)別》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、先來張大圖:結(jié)合上圖來說明一下解析的各個(gè)步驟涉及的鎖。?軟解析、硬解析、軟軟解析區(qū)別的簡單說明:為了將用戶寫的sql文本轉(zhuǎn)化為oracle認(rèn)識的且可執(zhí)行的語句,這個(gè)過程就叫做解析過程。解析分為硬解析和軟解析,SQL語句第一次解析時(shí)必須進(jìn)行硬解析一句話說明硬解析與軟解析的區(qū)別是:硬解析=?需要生成執(zhí)行計(jì)劃??軟解析=不需要生成執(zhí)行計(jì)劃在Oracle中存在兩種類型的SQL語句,一類為DDL語句,不共享使用,也就是每次執(zhí)行都需要進(jìn)行硬解析。還有一類就是DML語句,會(huì)進(jìn)行硬解析或軟解析。硬解析變成軟解析:?綁定變量軟解析變成軟軟解析:?設(shè)置session_cache
2、d_cursors,詳見?圖中涉及的各結(jié)構(gòu)簡單介紹:涉及的各結(jié)構(gòu)的簡單介紹:詳見:父游標(biāo):保存HASH值,SQL文本--相同SQL語句,就只有一個(gè)父游標(biāo)父游標(biāo)里主要包含兩種信息:sql文本以及優(yōu)化目標(biāo)。父游標(biāo)在第一次打開時(shí)被鎖定,直到其他所有的session都關(guān)閉該游標(biāo)后才被解鎖。當(dāng)父游標(biāo)被鎖定的時(shí)候是不能被交換出librarycache的,只有在解鎖以后才能被交換出librarycache。父游標(biāo)被交換出內(nèi)存時(shí)父游標(biāo)對應(yīng)的所有子游標(biāo)也被交換出librarycache。子游標(biāo):一個(gè)父游標(biāo)下會(huì)有多個(gè)子游標(biāo),各個(gè)子游標(biāo)的執(zhí)行計(jì)劃不一樣--多版本.一個(gè)父下必有一個(gè)
3、子游標(biāo),可以有多個(gè)子游標(biāo)。子游標(biāo)包括游標(biāo)所有的信息,比如具體的執(zhí)行計(jì)劃、綁定變量等。子游標(biāo)隨時(shí)可以被交換處librarycache,當(dāng)子游標(biāo)被交換出librarycache時(shí),oracle可以利用父游標(biāo)的信息重新構(gòu)建出一個(gè)子游標(biāo)出來,這個(gè)過程叫做reload(重載)。父HANDLE,里面有父游標(biāo)堆0的地址。。父游標(biāo)堆0:有指向一個(gè)或多個(gè)子游標(biāo)的HANDLE夠句柄地址子游標(biāo)的HANDLE:有子游標(biāo)堆0地址子游標(biāo)堆0:有SQL語句依賴關(guān)系,并指向子游標(biāo)的堆6子游標(biāo)堆6:存有SQL語句的執(zhí)行計(jì)劃SQL?語句在Librarycache?執(zhí)行的第一次檢查過程:1.通過
4、語法語義權(quán)限等檢查的SQL語句進(jìn)入Librarycache?2.將SQL文本轉(zhuǎn)化為ASCII值(大小寫ASCII不同)并進(jìn)行hash函數(shù)的運(yùn)算?4.得到一個(gè)HASH值對應(yīng)到hashbucket的號碼?################?以上檢查通過后,進(jìn)入以下解析過程軟軟解析:--通過設(shè)置session_cached_cursors參數(shù)實(shí)現(xiàn)-?SQL執(zhí)行=3次(可以不是一個(gè)會(huì)話執(zhí)行的SQL),堆6的DS-堆描述符地址被放入U(xiǎn)GA(屬于PGA)--LOCK變?yōu)?-?NULL?標(biāo)記語句為緩存并保證內(nèi)存不被釋放(堆6釋放堆0才能釋放)。?也就是SQL執(zhí)行3次,被緩存
5、。第四次,就是軟軟解析了。?--優(yōu)化目標(biāo):命中率90%以上。?會(huì)話發(fā)起SQL,會(huì)首先在UserGlobalArea中查找CURSOR信息。?此時(shí),在父游標(biāo)handle,子游標(biāo)handle和子游標(biāo)堆6上使用NULL1。?軟解析:1.獲得librarycacheLatch??---如未獲得將產(chǎn)生:Latch:librarycache?2.獲得librarycachelock,檢索bucket上的父游標(biāo)handle,得到所指向的父游標(biāo)堆0-LCO的內(nèi)存地址。?3.獲得librarycachepin,讀取父游標(biāo)堆0-LCO,得到子游標(biāo)handle地址。?4.獲得li
6、brarycachelock,檢索子游標(biāo)handle,得到所指向的子游標(biāo)堆0-子LCO的內(nèi)存地址。?5.獲得librarycachepin,讀取子游標(biāo)堆0-子LCO從而得到子游標(biāo)堆6地址。?6.讀取子游標(biāo)堆6,得到SQL執(zhí)行計(jì)劃。?###找到childlco后,增加parsecount(total)統(tǒng)計(jì)值。?SQL開始執(zhí)行:此時(shí)以共享模式獲得librarycachelock和librarycachepin,并執(zhí)行SQL。?FETCH階段:執(zhí)行完成進(jìn)入FETCH階段,SQLCURSOR將librarycachelock轉(zhuǎn)換為null模式,釋放libraryca
7、chepin。?###############################################################?在嘗試軟解析時(shí):?--如果未檢索到相同的父游標(biāo)LCO或子游標(biāo)LCO時(shí),發(fā)生硬解析。?--如果子游標(biāo)堆6上不能加共享librarycachepin或者childlco中信息不完整,需要重建執(zhí)行計(jì)劃--記錄為硬解析。硬解析:如果未檢索到相同的父游標(biāo)LCO或子游標(biāo)LCO時(shí),發(fā)生硬解析。進(jìn)程會(huì)一直持有l(wèi)ibrarycachelatch,直到硬解析結(jié)束為止。?1.獲取sharedpoollatch,從freelist的buck
8、et上查找合適大小的CHUNK。?不存在大小合適的C