一、SQL解析執(zhí)行主要包括三個(gè)步驟:
? ? ? ? ? 1、客戶端輸入SQL語(yǔ)句;
? ? ? ? ? 2、SQL語(yǔ)句通過網(wǎng)絡(luò)到達(dá)數(shù)據(jù)庫(kù)實(shí)例;
? ? ? ? ? 3、server process(前臺(tái)進(jìn)程)接收SQL語(yǔ)句:
? ? ? ? ? ? ? ? 1)解析:解析主要做兩件事情,SQL語(yǔ)法、權(quán)限、訪問對(duì)象是否存在等;SQL該如何執(zhí)行---找個(gè)最優(yōu)的執(zhí)行方案生成執(zhí)行計(jì)劃
? ? ? ? ? ? ? ? 2)執(zhí)行:根據(jù)生成的執(zhí)行計(jì)劃,執(zhí)行SQL
? ? ? ? ? ? ? ? 其中,SQL語(yǔ)句和執(zhí)行計(jì)劃都需要緩存,即shared pool
二、基本概念
? ? ? ? ? 1、Logic read:server process從buffer cache中讀取數(shù)據(jù)返回給用戶。
? ? ? ? ? 2、Physics read:server process先把dbf(數(shù)據(jù)庫(kù)文件)數(shù)據(jù)從磁盤讀到buffer cache中,然后再?gòu)腷uffer cache中讀取數(shù)據(jù)返回給用戶。
? ? ? ? ? 3、命中率:指的是,對(duì)于所有數(shù)據(jù)塊的讀取,buffer cache讀的塊數(shù)占buffer cache讀和dbf讀總塊數(shù)的比率。即L/(L+P)
? ? ? ? ? 在這里,命中率低一定有問題,命中率高的話,不一定沒問題。例如:一定時(shí)間邏輯讀10萬(wàn)次,物理讀1萬(wàn)。雖然命中率很高,但是物理讀也很多。那么,對(duì)于數(shù)據(jù)塊的讀取,需要關(guān)注每秒的物理讀次數(shù),即查看IO是否繁忙,可以通過以下命令:
linux:vmstat 1 10? ? ? iostat 1 10? ? sar 1 10? mpstat(查看多處理器狀況)
三、進(jìn)程之間的協(xié)同工作
? ? ? ? 考慮到最復(fù)雜情況,以修改和物理讀操作為例:
? ? ? ? ? 1、server process將dbf讀到buffer cache中進(jìn)行修改;
? ? ? ? ? 2、server process對(duì)數(shù)據(jù)的修改產(chǎn)生日志(server process產(chǎn)生),日志將被server process寫到log buffer(內(nèi)存空間)中;
? ? ? ? ? 3、commit之后,后臺(tái)進(jìn)程LGWR將日志實(shí)時(shí)寫到log file中;
? ? ? ? ? 4、在一定的觸發(fā)條件下,DBWR將臟的數(shù)據(jù)塊從buffer cache寫到磁盤中。
? ? ? ? ? 整個(gè)過程,server process不負(fù)責(zé)寫(datafile)而只負(fù)責(zé)讀(buffer cache)的原因:server process直接為用戶服務(wù),接收到用戶的SQL之后,首先對(duì)SQL進(jìn)行解析,然后執(zhí)行SQL,最后獲取數(shù)據(jù)將結(jié)果返回給用戶。如果server process慢的話,用戶會(huì)感到數(shù)據(jù)庫(kù)很慢。所以,server process并不關(guān)心什么時(shí)候?qū)⑿薷牡臄?shù)據(jù)寫到磁盤(交由后臺(tái)進(jìn)程DBWR、LGWR來(lái)完成)。
數(shù)據(jù)庫(kù)主要進(jìn)程的作用:
? ? ? CKPT:周期性運(yùn)行,比較輕松,將數(shù)據(jù)庫(kù)當(dāng)前的狀態(tài)信息寫到control file和datafile header中,即更新控制文件和數(shù)據(jù)文件頭部。
? ? ? SMON:負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)實(shí)例(SGA)內(nèi)部進(jìn)行清理和維護(hù)。例如:共享池的碎片整理
? ? ? PMON:負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)實(shí)例外部(server process)進(jìn)行維護(hù)和清理。例如:客戶端網(wǎng)絡(luò)斷掉,server process一直被用戶啟用著,PMON會(huì)周期性的啟動(dòng),發(fā)現(xiàn)server process的客戶端已經(jīng)斷掉,PMON會(huì)清理該server process:關(guān)掉server process的進(jìn)程,清理所對(duì)應(yīng)PGA的內(nèi)存空間。
? ? ? ARCH:歸檔log file
緩沖區(qū)的主要狀態(tài):
? ? ? 干凈、未使用、臟、連接(pin)---server process讀寫數(shù)據(jù)塊的瞬間
? ? ? 如果所有的buffer都被使用,優(yōu)先使用干凈的buffer(datafile中有相同的block);如果所有的buffer都是臟的,則會(huì)觸發(fā)DBWR將臟的buffer寫到磁盤,buffer變?yōu)楦蓛舻模軌虮恢赜谩?/p>
? ? ? 有些人可能會(huì)問:數(shù)據(jù)從磁盤被讀到buffer cache中,在內(nèi)存中是依據(jù)什么原則,如何組織的呢?DBWR寫臟數(shù)據(jù)塊到磁盤,又是依據(jù)什么規(guī)則呢?buffer cache使用了LRU chain和checkpoint queue來(lái)保證數(shù)據(jù)塊讀的命中率和臟數(shù)據(jù)塊是如何寫入磁盤的。在后續(xù)《buffer_cache內(nèi)存組織結(jié)構(gòu)剖析》和《檢查點(diǎn)隊(duì)列》章節(jié)中有詳細(xì)介紹。
四、SQL解析類型---硬解析與軟解析
? ? ? ? ? 1、shared pool的主要作用:緩存SQL語(yǔ)句和SQL語(yǔ)句的執(zhí)行計(jì)劃。它是由三塊區(qū)域組成:free、library cache、row cache(dictionary cache)。
? ? ? ? ? ? ? ? ? ? 1)library cache:緩存SQL語(yǔ)句以及SQL語(yǔ)句的執(zhí)行計(jì)劃
? ? ? ? ? ? ? ? ? ? 2)dictionary cache:oracle數(shù)據(jù)庫(kù)自身的信息。例如,數(shù)據(jù)庫(kù)中有多少表、多少用戶、表有多少列、列名是什么、列的數(shù)據(jù)類型、每個(gè)表多大等信息。其中,所有的數(shù)據(jù)字典信息可在官方文檔中查找books--->reference--->dba_tables
? ? ? ? ? 2、查看shared pool大小:select a.pool,sum(a.bytes) as sum_bytes from v$sgastat a where a.pool_name='shared pool' group by a.pool;

? ? ? ? ? 3、SQL解析(hard parse,soft parse):
? ? ? ? ? 硬解析主要由四個(gè)階段完成:
? ? ? ? ? ? ? ? ? 1)server process判斷SQL語(yǔ)句語(yǔ)法是否有錯(cuò)誤
? ? ? ? ? ? ? ? ? 2)查看SQL語(yǔ)句所涉及的對(duì)象是否存在
? ? ? ? ? ? ? ? ? 3)執(zhí)行SQL的用戶對(duì)對(duì)象是否有相應(yīng)權(quán)限(系統(tǒng)權(quán)限、對(duì)象全向)
? ? ? ? ? ? ? ? ? 4)生成執(zhí)行計(jì)劃,即在N個(gè)執(zhí)行方案中挑選出最優(yōu)的一個(gè)方案作為這條SQL的執(zhí)行計(jì)劃---最消耗資源
? ? ? ? ? 軟解析:不包含第四步,僅僅做常規(guī)判斷
? ? ? ? ? 那么,什么時(shí)候發(fā)生硬解析呢?server process拿著SQL語(yǔ)句在library cache中找,如果這條SQL語(yǔ)句在library cache中沒有,說(shuō)明該語(yǔ)句和它的執(zhí)行計(jì)劃在library cache中沒有,此時(shí)發(fā)生硬解析,如果有則發(fā)生軟解析。無(wú)論是硬解析還是軟解析,解析過程中用到很多數(shù)據(jù)庫(kù)自身信息(權(quán)限信息、對(duì)象信息、對(duì)象統(tǒng)計(jì)信息---字典信息),即對(duì)SQL語(yǔ)句進(jìn)行解析的時(shí)候,都要頻繁的訪問數(shù)據(jù)字典信息。所以,row cache放在shared pool和library cache在一起。
? ? ? ? ? 軟硬解析的具體情況:

? ? ? ? ? ? 本節(jié)主要以SQL的執(zhí)行過程為線索,初步認(rèn)識(shí)了shared pool的相關(guān)知識(shí)。下一節(jié)主要說(shuō)明shared pool內(nèi)存塊是如何組織的。