Oracle系統(tǒng)全局區(qū)(SGA)介紹
系統(tǒng)全局區(qū)(System Global Area)是所有用戶進(jìn)程共享的一塊內(nèi)存區(qū)域,也就是說,SGA中的數(shù)據(jù)資源可以被多個(gè)用戶進(jìn)程共同使用。SGA主要由高速數(shù)據(jù)緩沖區(qū)、共享池、重做日志緩沖區(qū)、java
系統(tǒng)全局區(qū)(System Global Area)是所有用戶進(jìn)程共享的一塊內(nèi)存區(qū)域,也就是說,SGA中的數(shù)據(jù)資源可以被多個(gè)用戶進(jìn)程共同使用。SGA主要由高速數(shù)據(jù)緩沖區(qū)、共享池、重做日志緩沖區(qū)、java池和大型池等內(nèi)部結(jié)構(gòu)組成。SGA隨著數(shù)據(jù)庫(kù)實(shí)例的啟動(dòng)而加載到內(nèi)存中,當(dāng)數(shù)據(jù)庫(kù)實(shí)例關(guān)閉時(shí),SGA區(qū)域也就消失了。
高速數(shù)據(jù)緩沖區(qū)(Database Buffer Cache)
高數(shù)數(shù)據(jù)緩沖區(qū)中存放著Oracle系統(tǒng)最近訪問過的數(shù)據(jù)塊(數(shù)據(jù)塊在高速緩沖區(qū)也可稱為緩存塊)。當(dāng)用戶向數(shù)據(jù)庫(kù)發(fā)出請(qǐng)求時(shí)(比如檢索某一條數(shù)據(jù)),如果在高速數(shù)據(jù)緩沖區(qū)存在請(qǐng)求的數(shù)據(jù),則Oracle系統(tǒng)會(huì)直接從高速數(shù)據(jù)緩沖區(qū)中讀取數(shù)據(jù)并返回給用戶,否則,Oracle會(huì)打開數(shù)據(jù)文件讀取請(qǐng)求的數(shù)據(jù)。
若無(wú)法在高速緩沖區(qū)中找到所需要的數(shù)據(jù),則Oracle首先從數(shù)據(jù)文件中讀取指定的數(shù)據(jù)塊到緩沖區(qū),然后再?gòu)木彌_區(qū)中將請(qǐng)求的數(shù)據(jù)返回給用戶。由于高速緩沖區(qū)被所有用戶共享,只要數(shù)據(jù)文件中的某些數(shù)據(jù)塊被當(dāng)前用戶或其他用戶請(qǐng)求過,那么這些數(shù)據(jù)塊就會(huì)被裝載到高速緩沖區(qū)中。這樣當(dāng)用戶再次訪問相同的數(shù)據(jù)時(shí),Oracle就不必再?gòu)臄?shù)據(jù)文件中讀取數(shù)據(jù),而是可以直接將緩沖區(qū)的數(shù)據(jù)返回給用戶。
經(jīng)?;蜃罱辉L問的數(shù)據(jù)塊會(huì)被放置到高速緩沖區(qū)前端,不常被訪問的數(shù)據(jù)塊會(huì)被放置到高速緩沖區(qū)的后端,當(dāng)高速數(shù)據(jù)緩沖區(qū)填滿時(shí),會(huì)自動(dòng)擠掉一些不常被訪問的數(shù)據(jù)塊。以存取速度來看,內(nèi)存的讀取速度遠(yuǎn)快于物理硬盤,所以高速數(shù)據(jù)緩沖區(qū)的存在可以大大降低對(duì)物理磁盤的讀取頻率,從而達(dá)到提高數(shù)據(jù)服務(wù)器性能的目的。為了便于管理SGA的內(nèi)存數(shù)據(jù),Oracle把高速數(shù)據(jù)緩沖區(qū)分為以下3部分:
重做日志緩沖區(qū)(Red Log Buffer Cache)
重做日志緩沖區(qū)用于存放對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改操作時(shí)所產(chǎn)生的日志信息,這些日志信息在寫入到重做日志文件之前,首先存放到日志文件緩沖區(qū)中,然后,在檢查點(diǎn)發(fā)生或重做日志文件緩沖區(qū)中的我信息量達(dá)到一定峰值時(shí),最后由日志寫入進(jìn)程(LGWR)將此緩沖區(qū)的內(nèi)容寫入到重做日志文件。
重做日志緩沖區(qū)的大小由LOG_BUFFER參數(shù)指定,該參數(shù)也可以在實(shí)例啟動(dòng)之后進(jìn)行動(dòng)態(tài)修改。相對(duì)于高速數(shù)據(jù)緩沖區(qū)而言,重做日志緩沖區(qū)的大小對(duì)數(shù)據(jù)的性能影響較小,通常較大的重做日志緩沖區(qū)能減少重做日志文件對(duì)I/O的讀寫次數(shù),對(duì)數(shù)據(jù)庫(kù)的整體性能有一定提高。
共享池(Shared Pool)
共享池是SGA保留的內(nèi)存區(qū)域,用于緩存SQL語(yǔ)句、PL/SQL語(yǔ)句、數(shù)據(jù)字典、資源鎖、字符集以及其他控制結(jié)構(gòu)等。共享池包含庫(kù)高速緩沖區(qū)(Library cache)和數(shù)據(jù)字典高速緩沖區(qū)(Dictionary cache)。
大型池(Large Pool)
大型池在SQA區(qū)中不是必須的內(nèi)存結(jié)構(gòu),只在某些特殊情況下,實(shí)例需要使用大型池來減輕共享池的訪問壓力,通常的情況有以下幾種:
- 用來提供內(nèi)存空間給Java虛擬機(jī)使用,目的是支持在數(shù)據(jù)庫(kù)中運(yùn)行Java程序包,其大小由JAVA_POOL_SIZE參數(shù)決定。
- 流池:Oracle流池用于數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)之間進(jìn)行信息共享。如沒有用到Oracle流,就不需要設(shè)置該池。流池的大小由參數(shù)STREAMS_POOL_SIZE決定。