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