oracle10g SGA

xunmingxxx發表於2011-06-27

SGASystem Global Area)是一塊用於載入資料、物件並儲存執行狀態和資料控制資訊的一塊區域,在例項啟動時分配,當例項關閉時釋放,每個例項都有自己的SGA。連線到資料庫的使用者都可以共享SGA中的資料,通常為了最佳化效能,在實體記憶體允許的情況下設定更高的SGA,以減少物理I/O的讀寫次數。

1、 固定區域(Fixed Area

Fixed Area部分是SGA中的固定部分,包含幾千個變數和一些小的資料結構,如Latch或地址指標等,這部分記憶體分配和特定的資料庫版本以及平臺有關,不受使用者限制,而且這些資訊對於資料庫來說非常重要,但都不需要使用者參與。

固定部分只需要很小的記憶體,可以透過一個內部表X$KSMFSV[K]ernel [S]ervice Layer [M]emery Management,Address of [F]ixed [S]GA [V]ariables)查詢,此外,Oracle的內部表X$KSMMEM記錄了整個SGA的地址對映關係,透過X$KSMFSVX$KSMMEM關聯,可以找出Fixed Area中每個變數的設定。

Fixed Area包含很多控制資訊,但是需要注意的是,查詢X$KSMFSV檢視可能導致程式異常,需要謹慎使用。

2、 Buffer Cache

Buffer Cache用於儲存最近使用的資料塊,這些資料塊可能是被修改過的,也可能是未經修改的,在Oracle對資料的處理過程中,代價最昂貴的就是物理I/O的操作了,所以儘可能多的快取可以提高Oracle資料庫的效能。

Oracle9i之前,Buffer Cache的設定主要由兩個引數決定:db_block_buffersdb_block_sizeDb_block_buffers設定分配給Buffer Cachedb_block數量,db_block_size指定資料塊的尺寸。這兩個資料的乘積才是Buffer Cache的大小。

Oracle9i開始,Oracle引入了一個新的初始化引數db_cache_size,該引數用來定義主Block_sizeDefault緩衝池的大小。

Db_cache_size最小值為一個粒度(Granule),粒度也是Oracle9i引入的一個新的概念,是連續虛擬記憶體分配的單位,其大小取決於估計的SGA的總大小。

Oracle10gR2中,Granule的分配演算法有所改變,在大多數平臺上,如果SGA<1GBGranule通常為4MBGranule的大小受一個內部隱含引數_ksmg_granule_size的控制。

Enter value for par: _ksmg_granule_size

NAME VALUE PDESC

------------------------------ ------------------------- ----------------------------------------

_ksmg_granule_size 4194304 granule size in bytes

各記憶體元件所使用的Granule大小可以透過動態檢視查詢得到,如下所示:

SQL> select component,granule_size from v$sga_dynamic_components;

COMPONENT GRANULE_SIZE

---------------------------------------------------------------- ------------

shared pool 4194304

large pool 4194304

pool 4194304

streams pool 4194304

DEFAULT buffer cache 4194304

KEEP buffer cache 4194304

RECYCLE buffer cache 4194304

DEFAULT 2K buffer cache 4194304

DEFAULT 4K buffer cache 4194304

DEFAULT 8K buffer cache 4194304

DEFAULT 16K buffer cache 4194304

DEFAULT 32K buffer cache 4194304

ASM Buffer Cache 4194304

Oracle對於Buffer Cache的管理採用的LRU演算法,但是這又帶來另一個問題,很多批處理操作(如全表掃描)可能會導致Buffer Cache的重新整理,將經常使用的資料“擠出”Buffer Cache,在不同的版本中,Oracle也在不停的改進LRU的演算法,提出了多緩衝池,從另一個方面來解決這個問題。所謂的多緩衝池是將預設的緩衝池做進一步的細分,如下:

(1) Default Buffer Cache

(2) Keep Buffer Cache

(3) Recycle Buffer Cache

不同的緩衝池對資料的緩衝時間不同。對於經常使用的資料,可以在建表是就指定將其存放在Keep池中;對於經常一次性讀取的資料,可以將其放在Recycle池中,而Default池用於存放未指定儲存池的資料,按照LRU演算法。

預設情況下,所有表都使用Default池,它的大小就是資料緩衝區Buffer Cache的大小,由初始化引數db_cache_size決定。

此外,從Oracle9i開始支援多型別資料塊大小表空間支援,在一個資料庫中可以存在多種block_size的表空間,分別支援2k

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24829399/viewspace-1051678/,如需轉載,請註明出處,否則將追究法律責任。

下一篇: oracle-startup過程
oracle10g SGA
請登入後發表評論 登入
全部評論

相關文章