我們知道,內(nèi)存結(jié)構(gòu)是Oracle體系結(jié)構(gòu)中最重要的部分之一。按照系統(tǒng)對內(nèi)存使用方法的不同,可以分為系統(tǒng)全局區(qū)(SGA)、程序全局區(qū)(PGA)、排序區(qū)(Sort Area)、大池(Large Pool)、及java池(java Pool),本文我們先介紹一下Oracle 10g內(nèi)存結(jié)構(gòu)之系統(tǒng)全局區(qū)的內(nèi)容,接下來我們就開始介紹這部分內(nèi)容。
系統(tǒng)全局區(qū)(System Global Area)
它是一組為系統(tǒng)分配的內(nèi)存共享結(jié)構(gòu),可以包含一個數(shù)據(jù)庫實例的數(shù)據(jù)和控制信息。如果多個用戶連接到一個實例,在實例的系統(tǒng)全局區(qū)中,數(shù)據(jù)可以被多個用戶共享,所以又稱共享全局區(qū)。系統(tǒng)全局區(qū)按其作用不同,可以分為數(shù)據(jù)緩沖區(qū)、日志緩沖區(qū)及共享池。
數(shù)據(jù)緩沖區(qū):
數(shù)據(jù)緩沖區(qū)用于從磁盤讀入的數(shù)據(jù),供所有用戶共享。
修改的數(shù)據(jù)、插入的數(shù)據(jù)存儲在數(shù)據(jù)緩沖區(qū)中,修改完成或DBWR進(jìn)程的其他條件引發(fā)時,數(shù)據(jù)被寫入數(shù)據(jù)文件
數(shù)據(jù)緩沖區(qū)工作原理:
LRU (Least recently used):最近最少使用原則的縮寫,是一種數(shù)據(jù)緩沖區(qū)的一種管理機(jī)制,,只保留最近數(shù)據(jù),不保留舊數(shù)據(jù)。
Dirty:表示臟數(shù)據(jù),臟數(shù)據(jù)是修改后還沒有寫到數(shù)據(jù)文件的數(shù)據(jù)。
Oracle10g 的數(shù)據(jù)庫內(nèi)存的設(shè)置參數(shù)不再由DB_BLOCK_BUFFERS確定,而是由oracle的新參數(shù)DB_CACHE_SIZE 和DB_nK_CACHE_SIZE確定,不同的數(shù)據(jù)段可以使用不同的數(shù)據(jù)塊。大表可以存儲在大的數(shù)據(jù)塊表空間中,小表可以存儲在小的數(shù)據(jù)塊表空間中,以優(yōu)化i/o性能。對于系統(tǒng)表空間、臨時表空間、及其它默認(rèn)設(shè)置的表空間,可以使用標(biāo)準(zhǔn)的數(shù)據(jù)塊DB_BLOCK_SIZE確定。
標(biāo)準(zhǔn)數(shù)據(jù)塊DB_BLOCK_SIZE用于系統(tǒng)表空間及默認(rèn)表空間,其他表空間可以使用非標(biāo)準(zhǔn)數(shù)據(jù)塊BLOCKSIZE(創(chuàng)建表空間時使用),其值分別為 2k 4k 8k 16k 32k ,非標(biāo)準(zhǔn)數(shù)據(jù)塊的數(shù)據(jù)緩沖區(qū)使用參數(shù)DB_Nk_CACHE_SIZE確定。
需要注意的是BLOCKSIZE不得用于標(biāo)準(zhǔn)塊。如果設(shè)置了DB_BLOCK_SIZE=2048,則不得設(shè)置DB_2K_CACHE_SIZE,標(biāo)準(zhǔn)塊必須使用參數(shù)DB_CACHE_SIZE 來設(shè)置。同時可以在線修改數(shù)據(jù)緩沖區(qū)參數(shù):SQL> alter system set db_2k_cache_size = 10M ;如果要查詢數(shù)據(jù)緩沖區(qū)大小,可以如下:SQL> show parameter db。
在創(chuàng)建不同數(shù)據(jù)塊表空間時,要使用參數(shù)BLOCKSIZE指出數(shù)據(jù)塊的大小,同時在參數(shù)文件中要使用DB_Nk_CACHE_SIZE 進(jìn)行配置,與BLOCKSIZE的個數(shù)相對應(yīng),否則會出現(xiàn)錯誤。
設(shè)置動態(tài)內(nèi)存時,可以將多個參數(shù)全部寫入?yún)?shù)文件,格式如下:
- # cache and i/o
- DB_BLOCK_SIZE=4096
- DB_CACHE_SIZE=20971520
- DB_2K_CACHE_SIZE=8M
- DB_8K_CACHE_SIZE=4M
- ……..
其中,參數(shù) DB_CACHE_SIZE 只適用于系統(tǒng)表空間、臨時表空間、及默認(rèn)表空間,DB_2K_CACHE_SIZE 適合 BLOCKSIZE 為2K的表空間。8K 也是一樣的道理。
數(shù)據(jù)緩沖區(qū)對數(shù)據(jù)庫德存取速度又直接影響。一般的緩沖區(qū)命中率應(yīng)該在90% 以上。例如,使用數(shù)據(jù)字典 v$sysstat 計算數(shù)據(jù)緩沖區(qū)命中率:
- SQL> select a.value+b.value “logical_reads” , c.value “phys_reads”,
- Round(100* ( ( a.value+b.value)- c.value) /
- ( a.value+b.value ) ) “buffer hit radio “
- From v$sysstat a, v$sysstat b,v$sysstat c
- Where a.statistic#=38 and b.statistic#=39 and c.statistic#=40;
下面是計算數(shù)據(jù)緩沖命中率的另一種方法:
- SQL> select name, value
- From v$sysstat
- Where name in ( ‘session logical reads’,’physical reads’,physical reads direct’, ‘physical reads direct (lob)’);
其中:Session logical reads 為讀的總量。Physical reads為從數(shù)據(jù)文件讀。Physical reads direct 為從緩沖區(qū)讀(不含lobs)。Physical reads direct (lobs) 為從緩沖區(qū)讀(含lobs)。Hit Ratio = 1- ( ( physical reads- physical reads direct – physical reads direct(lob) ) /session logical reads) = 95%。
日志緩沖區(qū)
日志緩沖區(qū)用來存儲數(shù)據(jù)庫的修改信息。日志信息首先在日志緩沖區(qū)中產(chǎn)生,當(dāng)日志緩沖區(qū)的日志達(dá)到一定數(shù)量時,由日志寫入進(jìn)程LGWR將日志數(shù)據(jù)寫入日志文件組,再經(jīng)過切換,由歸檔進(jìn)程ARCH將日志數(shù)據(jù)寫入歸檔介質(zhì)。
日志緩沖區(qū)大小由參數(shù)LOG_BUFFER確定,要查詢?nèi)罩揪彌_區(qū)大小可以用以下方法:
方法一:參數(shù)文件中:
- ……
- Processes = 150
- Parallel_max_servers = 5
- Log_buffer = 32768
- ……..
方法二:
- SQL> select name,value from v$parameter where name like ‘%buffer’;
方法三:
- SQL> show parameter log_buffer
對于日志緩沖區(qū)而言可以計算失敗率,使用數(shù)據(jù)字典v$latch 計算日志緩沖區(qū)的失敗率
- SQL>select name,gets,misses,immediate_gets,immediate_misses,
- Decode(gets,0,0,misses/gets*100) ratiol,
- Decode (immediate_gets+immediate_misses,0,0,
- immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
- from v$latch
- where name in (‘redo allocation’, ‘redo copy’);
其中
Gets 表示成功等待日志緩沖區(qū)的次數(shù)。
Immediate gets 表示成功立即得到日志緩沖區(qū)的次數(shù)。
Immediate misses 表示未成功立即得到日志緩沖區(qū)的次數(shù)。
等待表示日志在進(jìn)入日志緩沖區(qū)時,因為日志緩沖區(qū)過小而沒有空閑空間,所以日志緩沖區(qū)的失敗可以表示日志緩沖區(qū)是否足夠大,不夠大時,用戶的日志寫將產(chǎn)生等待過程。日志緩沖區(qū)的失敗率應(yīng)該小于1%。
此外,可以查詢用戶進(jìn)程等待日志緩沖區(qū)時的次數(shù),通過數(shù)據(jù)字典v$sysstat 得到:
- SQL> select name,value from v$sysstat
- Where name = ‘ redo buffer allocation retries’ ;
關(guān)于Oracle 10g內(nèi)存結(jié)構(gòu)之系統(tǒng)全局區(qū)的相關(guān)知識就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!