我們知道,內存結構是Oracle體系結構中最重要的部分之一。按照系統對內存使用方法的不同,可以分為系統全局區(SGA)、程序全局區(PGA)、排序區(Sort Area)、大池(Large Pool)、及java池(Java Pool),本文我們先介紹一下Oracle 10g內存結構之系統全局區的內容,接下來我們就開始介紹這部分內容。
系統全局區(System Global Area)
它是一組為系統分配的內存共享結構,可以包含一個數據庫實例的數據和控制信息。如果多個用戶連接到一個實例,在實例的系統全局區中,數據可以被多個用戶共享,所以又稱共享全局區。系統全局區按其作用不同,可以分為數據緩沖區、日志緩沖區及共享池。
數據緩沖區:
數據緩沖區用於從磁盤讀入的數據,供所有用戶共享。
修改的數據、插入的數據存儲在數據緩沖區中,修改完成或DBWR進程的其他條件引發時,數據被寫入數據文件
數據緩沖區工作原理:
LRU (Least recently used):最近最少使用原則的縮寫,是一種數據緩沖區的一種管理機制,,只保留最近數據,不保留舊數據。
Dirty:表示髒數據,髒數據是修改後還沒有寫到數據文件的數據。
Oracle10g 的數據庫內存的設置參數不再由DB_BLOCK_BUFFERS確定,而是由Oracle的新參數DB_CACHE_SIZE 和DB_nK_CACHE_SIZE確定,不同的數據段可以使用不同的數據塊。大表可以存儲在大的數據塊表空間中,小表可以存儲在小的數據塊表空間中,以優化i/o性能。對於系統表空間、臨時表空間、及其它默認設置的表空間,可以使用標准的數據塊DB_BLOCK_SIZE確定。
標准數據塊DB_BLOCK_SIZE用於系統表空間及默認表空間,其他表空間可以使用非標准數據塊BLOCKSIZE(創建表空間時使用),其值分別為 2k 4k 8k 16k 32k ,非標准數據塊的數據緩沖區使用參數DB_Nk_CACHE_SIZE確定。
需要注意的是BLOCKSIZE不得用於標准塊。如果設置了DB_BLOCK_SIZE=2048,則不得設置DB_2K_CACHE_SIZE,標准塊必須使用參數DB_CACHE_SIZE 來設置。同時可以在線修改數據緩沖區參數:SQL> alter system set db_2k_cache_size = 10M ;如果要查詢數據緩沖區大小,可以如下:SQL> show parameter db。
在創建不同數據塊表空間時,要使用參數BLOCKSIZE指出數據塊的大小,同時在參數文件中要使用DB_Nk_CACHE_SIZE 進行配置,與BLOCKSIZE的個數相對應,否則會出現錯誤。
設置動態內存時,可以將多個參數全部寫入參數文件,格式如下:
- # cache and i/o
- DB_BLOCK_SIZE=4096
- DB_CACHE_SIZE=20971520
- DB_2K_CACHE_SIZE=8M
- DB_8K_CACHE_SIZE=4M
- ……..
其中,參數 DB_CACHE_SIZE 只適用於系統表空間、臨時表空間、及默認表空間,DB_2K_CACHE_SIZE 適合 BLOCKSIZE 為2K的表空間。8K 也是一樣的道理。
數據緩沖區對數據庫德存取速度又直接影響。一般的緩沖區命中率應該在90% 以上。例如,使用數據字典 v$sysstat 計算數據緩沖區命中率:
- 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;
下面是計算數據緩沖命中率的另一種方法:
- 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為從數據文件讀。Physical reads direct 為從緩沖區讀(不含lobs)。Physical reads direct (lobs) 為從緩沖區讀(含lobs)。Hit Ratio = 1- ( ( physical reads- physical reads direct – physical reads direct(lob) ) /session logical reads) = 95%。
日志緩沖區
日志緩沖區用來存儲數據庫的修改信息。日志信息首先在日志緩沖區中產生,當日志緩沖區的日志達到一定數量時,由日志寫入進程LGWR將日志數據寫入日志文件組,再經過切換,由歸檔進程ARCH將日志數據寫入歸檔介質。
日志緩沖區大小由參數LOG_BUFFER確定,要查詢日志緩沖區大小可以用以下方法:
方法一:參數文件中:
- ……
- 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
對於日志緩沖區而言可以計算失敗率,使用數據字典v$latch 計算日志緩沖區的失敗率
- 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 表示成功等待日志緩沖區的次數。
Immediate gets 表示成功立即得到日志緩沖區的次數。
Immediate misses 表示未成功立即得到日志緩沖區的次數。
等待表示日志在進入日志緩沖區時,因為日志緩沖區過小而沒有空閒空間,所以日志緩沖區的失敗可以表示日志緩沖區是否足夠大,不夠大時,用戶的日志寫將產生等待過程。日志緩沖區的失敗率應該小於1%。
此外,可以查詢用戶進程等待日志緩沖區時的次數,通過數據字典v$sysstat 得到:
- SQL> select name,value from v$sysstat
- Where name = ‘ redo buffer allocation retrIEs’ ;
關於Oracle 10g內存結構之系統全局區的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!