程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 10g內存結構之系統全局區簡介

Oracle 10g內存結構之系統全局區簡介

編輯:Oracle數據庫基礎

我們知道,內存結構是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的個數相對應,否則會出現錯誤。

設置動態內存時,可以將多個參數全部寫入參數文件,格式如下:

  1. # cache and i/o  
  2.  DB_BLOCK_SIZE=4096 
  3.  DB_CACHE_SIZE=20971520 
  4.  DB_2K_CACHE_SIZE=8M 
  5.  DB_8K_CACHE_SIZE=4M 
  6.  …….. 

其中,參數 DB_CACHE_SIZE 只適用於系統表空間、臨時表空間、及默認表空間,DB_2K_CACHE_SIZE  適合 BLOCKSIZE 為2K的表空間。8K 也是一樣的道理。

數據緩沖區對數據庫德存取速度又直接影響。一般的緩沖區命中率應該在90% 以上。例如,使用數據字典 v$sysstat 計算數據緩沖區命中率:

  1. SQL> select a.value+b.value “logical_reads” , c.value “phys_reads”,  
  2.       Round(100* ( ( a.value+b.value)- c.value) /  
  3.       ( a.value+b.value ) ) “buffer hit radio “  
  4.       From v$sysstat a, v$sysstat b,v$sysstat c  
  5.       Where a.statistic#=38 and b.statistic#=39 and c.statistic#=40; 

下面是計算數據緩沖命中率的另一種方法:

  1. SQL> select name, value  
  2.       From v$sysstat  
  3.       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確定,要查詢日志緩沖區大小可以用以下方法:

方法一:參數文件中:

  1.  ……  
  2.  Processes = 150 
  3.  Parallel_max_servers = 5 
  4. Log_buffer = 32768 
  5. …….. 

方法二:

  1. SQL> select name,value from v$parameter where name like ‘%buffer’; 

方法三:

  1. SQL> show parameter log_buffer 

對於日志緩沖區而言可以計算失敗率,使用數據字典v$latch 計算日志緩沖區的失敗率

  1. SQL>select name,gets,misses,immediate_gets,immediate_misses,  
  2.      Decode(gets,0,0,misses/gets*100) ratiol,  
  3.      Decode (immediate_gets+immediate_misses,0,0,  
  4. immediate_misses/(immediate_gets+immediate_misses)*100)   ratio2  
  5.      from v$latch  
  6.      where name in (‘redo allocation’, ‘redo copy’); 

其中

Gets 表示成功等待日志緩沖區的次數。

Immediate gets 表示成功立即得到日志緩沖區的次數。

Immediate misses 表示未成功立即得到日志緩沖區的次數。

等待表示日志在進入日志緩沖區時,因為日志緩沖區過小而沒有空閒空間,所以日志緩沖區的失敗可以表示日志緩沖區是否足夠大,不夠大時,用戶的日志寫將產生等待過程。日志緩沖區的失敗率應該小於1%。

此外,可以查詢用戶進程等待日志緩沖區時的次數,通過數據字典v$sysstat 得到:

  1. SQL> select name,value from v$sysstat  
  2.       Where name = ‘ redo buffer allocation retrIEs’ ; 

關於Oracle 10g內存結構之系統全局區的相關知識就介紹到這裡了,希望本次的介紹能夠對您有所收獲!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved