一姜钳、SQL解析執(zhí)行主要包括三個(gè)步驟:
? ? ? ? ? 1藤树、客戶端輸入SQL語句;
? ? ? ? ? 2算吩、SQL語句通過網(wǎng)絡(luò)到達(dá)數(shù)據(jù)庫實(shí)例留凭;
? ? ? ? ? 3、server process(前臺(tái)進(jìn)程)接收SQL語句:
? ? ? ? ? ? ? ? 1)解析:解析主要做兩件事情偎巢,SQL語法蔼夜、權(quán)限、訪問對象是否存在等压昼;SQL該如何執(zhí)行---找個(gè)最優(yōu)的執(zhí)行方案生成執(zhí)行計(jì)劃
? ? ? ? ? ? ? ? 2)執(zhí)行:根據(jù)生成的執(zhí)行計(jì)劃求冷,執(zhí)行SQL
? ? ? ? ? ? ? ? 其中瘤运,SQL語句和執(zhí)行計(jì)劃都需要緩存,即shared pool
二匠题、基本概念
? ? ? ? ? 1拯坟、Logic read:server process從buffer cache中讀取數(shù)據(jù)返回給用戶。
? ? ? ? ? 2韭山、Physics read:server process先把dbf(數(shù)據(jù)庫文件)數(shù)據(jù)從磁盤讀到buffer cache中似谁,然后再從buffer cache中讀取數(shù)據(jù)返回給用戶。
? ? ? ? ? 3掠哥、命中率:指的是巩踏,對于所有數(shù)據(jù)塊的讀取,buffer cache讀的塊數(shù)占buffer cache讀和dbf讀總塊數(shù)的比率续搀。即L/(L+P)
? ? ? ? ? 在這里塞琼,命中率低一定有問題,命中率高的話禁舷,不一定沒問題彪杉。例如:一定時(shí)間邏輯讀10萬次,物理讀1萬牵咙。雖然命中率很高派近,但是物理讀也很多。那么洁桌,對于數(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對數(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之后泊业,首先對SQL進(jìn)行解析把沼,然后執(zhí)行SQL,最后獲取數(shù)據(jù)將結(jié)果返回給用戶吁伺。如果server process慢的話饮睬,用戶會(huì)感到數(shù)據(jù)庫很慢。所以篮奄,server process并不關(guān)心什么時(shí)候?qū)⑿薷牡臄?shù)據(jù)寫到磁盤(交由后臺(tái)進(jìn)程DBWR捆愁、LGWR來完成)。
數(shù)據(jù)庫主要進(jìn)程的作用:
? ? ? CKPT:周期性運(yùn)行窟却,比較輕松昼丑,將數(shù)據(jù)庫當(dāng)前的狀態(tài)信息寫到control file和datafile header中,即更新控制文件和數(shù)據(jù)文件頭部夸赫。
? ? ? SMON:負(fù)責(zé)對數(shù)據(jù)庫實(shí)例(SGA)內(nèi)部進(jìn)行清理和維護(hù)菩帝。例如:共享池的碎片整理
? ? ? PMON:負(fù)責(zé)對數(shù)據(jù)庫實(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)程握础,清理所對應(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來保證數(shù)據(jù)塊讀的命中率和臟數(shù)據(jù)塊是如何寫入磁盤的。在后續(xù)《buffer_cache內(nèi)存組織結(jié)構(gòu)剖析》和《檢查點(diǎn)隊(duì)列》章節(jié)中有詳細(xì)介紹茶敏。
四壤靶、SQL解析類型---硬解析與軟解析
? ? ? ? ? 1、shared pool的主要作用:緩存SQL語句和SQL語句的執(zhí)行計(jì)劃惊搏。它是由三塊區(qū)域組成:free贮乳、library cache忧换、row cache(dictionary cache)。
? ? ? ? ? ? ? ? ? ? 1)library cache:緩存SQL語句以及SQL語句的執(zhí)行計(jì)劃
? ? ? ? ? ? ? ? ? ? 2)dictionary cache:oracle數(shù)據(jù)庫自身的信息向拆。例如亚茬,數(shù)據(jù)庫中有多少表、多少用戶浓恳、表有多少列刹缝、列名是什么、列的數(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語句語法是否有錯(cuò)誤
? ? ? ? ? ? ? ? ? 2)查看SQL語句所涉及的對象是否存在
? ? ? ? ? ? ? ? ? 3)執(zhí)行SQL的用戶對對象是否有相應(yīng)權(quán)限(系統(tǒng)權(quán)限疑务、對象全向)
? ? ? ? ? ? ? ? ? 4)生成執(zhí)行計(jì)劃沾凄,即在N個(gè)執(zhí)行方案中挑選出最優(yōu)的一個(gè)方案作為這條SQL的執(zhí)行計(jì)劃---最消耗資源
? ? ? ? ? 軟解析:不包含第四步,僅僅做常規(guī)判斷
? ? ? ? ? 那么知允,什么時(shí)候發(fā)生硬解析呢撒蟀?server process拿著SQL語句在library cache中找,如果這條SQL語句在library cache中沒有温鸽,說明該語句和它的執(zhí)行計(jì)劃在library cache中沒有保屯,此時(shí)發(fā)生硬解析,如果有則發(fā)生軟解析涤垫。無論是硬解析還是軟解析姑尺,解析過程中用到很多數(shù)據(jù)庫自身信息(權(quán)限信息、對象信息蝠猬、對象統(tǒng)計(jì)信息---字典信息)切蟋,即對SQL語句進(jìn)行解析的時(shí)候,都要頻繁的訪問數(shù)據(jù)字典信息榆芦。所以柄粹,row cache放在shared pool和library cache在一起。
? ? ? ? ? 軟硬解析的具體情況:
? ? ? ? ? ? 本節(jié)主要以SQL的執(zhí)行過程為線索匆绣,初步認(rèn)識(shí)了shared pool的相關(guān)知識(shí)驻右。下一節(jié)主要說明shared pool內(nèi)存塊是如何組織的。