【基礎篇記憶體結構】oracle10g記憶體結構(一)

yellowlee發表於2010-06-23

Oracle的記憶體是與例項對應的,一個例項就有一個獨立的記憶體結構,Oracle的記憶體中主要儲存以下資訊:

1,oracle的程式程式碼以及程式執行所需的資訊

2,資料快取

3,會話資訊以及程式間通訊的資訊(如鎖)

Oracle的基本記憶體結構包括:

Sga(system global area),此區域由所有的服務程式和後臺程式共享

Pga(program global area),此區域是每個服務程式和後臺程式所似有,即每個程式都有一個屬於自己的pga

可以用下表示意:

 

SGA

 

Share pool

Buffer cache

Redo log buffer

Java pool

Stream pool(10g)

Large pool

Fixed SGA

Keep buffer cache

User define buffer

 

PGA(*n)

 

Bitmap merge area

Sort area

Hash area

 

 

Sga包含

資料快取區(database buffer cache)

重做日誌緩衝區(redo log buffer)

共享池(shared pool)

Java(java pool)

大池(large pool)

資料流池(streams pool)

資料字典快取區(data dictionary cache)

其他資訊(如資料庫和例項的狀態資訊)

 

當例項啟動時系統即分配sga。例如:

SQL> startup nomount;

ORACLE instance started.

 

Total System Global Area  591396864 bytes

Fixed Size                  1268800 bytes

Variable Size             322962368 bytes

Database Buffers          260046848 bytes

Redo Buffers                7118848 bytes

SQL>

可以通過一些引數來設定sga,這些引數影響系統的整體效能。

SGA_MAX_SIZESGA_TARGET

SQL> show parameters SGA

 

NAME                                 TYPE        VALUE

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

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 564M

sga_target                           big integer 564M

SQL>

也可以通過v$sga系統檢視來檢視對應的值:

SQL> select * from  v$sga;

 

NAME                      VALUE

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

Fixed Size              1268800

Variable Size         322962368

Database Buffers      260046848

Redo Buffers            7118848

 

在前面的sga相關引數中還有兩個分別是lock_sgapre_page_sgapre_page_sga預設設定為false,例項啟動時不必將sga全部分配實體記憶體,設定為true則是全部分配,當lock_sga設定為true時,鎖定sga在實體記憶體中,不允許換入和換出。

 

SGA_TARGET

當設定了SGA_TARGET引數時,資料庫自動啟動了ASMM(自動記憶體管理),oracle將代替人工來控制sga中的buffer poolshared pool等區域的大小,隨時調節以將系統效能最大化和最合理化。Sga_target的值總是小於或等於sga_max_size。不能指定大於sga_max_sizesga_target,例如:

SQL> alter system set sga_target=600M;

alter system set sga_target=600M

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00823: Specified value of sga_target greater than sga_max_size

 

當指定SGA_TARGET小於SGA_MAX_SIZE,例項重啟後,SGA_MAX_SIZE就自動變為和SGA_TARGET一樣的值了。但可以將sga_max_size設定的稍大,在啟動例項的時候可以動態的設定sga_target的值:

SQL> alter system set sga_target=500M;

 

System altered.

 

SQL> show parameters SGA;

 

NAME                                 TYPE        VALUE

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

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 564M

sga_target                           big integer 500M

SQL> alter system set sga_target=564M;

 

System altered.

 

SQL>

 

如果sga_target=0sga的容量由多個初始化引數決定,主要有:

DB_CACHE_SIZE 標準容量資料塊使用的快取區的容量

LOG_BUFFER 重做日誌緩衝區的容量,以位元組為單位

SHARED_POOL_SIZE 儲存共享SQLPLSQL的記憶體容量,以位元組為單位

LARGE_POOL_SIZE 大池容量,預設為0

JAVA_POOL_SIZE java池的容量

DB_nK_CACHE_SIZE 非標準容量資料塊使用的快取區

DB_KEEP_CACHE_SIZE 保留快取區

DB_RECYCLE_CACHE_SIZE 回收快取區

這些引數可以使用alter system來調整

 

可以通過v$sgastat檢視來檢視sga的相關統計資訊,這個檢視記錄了各個池的記憶體分配情況,例如:

SQL> desc v$sgastat;

 Name                                      Null?    Type

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

 POOL                                               VARCHAR2(12)

 NAME                                               VARCHAR2(26)

 BYTES                                              NUMBER

 

SQL> select pool,sum(bytes) from v$sgastat group by grouping sets (pool,());

 

POOL         SUM(BYTES)

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

java pool       4194304

large pool      4194304

shared pool   314577492

            268434496

            591400596

 

SQL> select * from v$sgastat where rownum <10;

 

POOL         NAME                            BYTES

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

             fixed_sga                     1268800

             buffer_cache                260046848

             log_buffer                    7118848

shared pool  KGX                            105012

shared pool  call                            22048

shared pool  list                             3584

shared pool  dummy                            9468

shared pool  kfmsg                            3088

shared pool  kksss                            3072

 

9 rows selected.

 

檢視V$SGA_DYNAMIC_FREE_MEMORY記錄當前sga可用於動態調整sga記憶體區的空閒區域大小。由於設定的sga_target=0,因此值為0

SQL> select * from V$SGA_DYNAMIC_FREE_MEMORY a;

 

CURRENT_SIZE

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

           0

 

SQL>

 

資料庫緩衝

10g使用db_cache_size來設定buffer cache的大小

oracle使用者程式第一次訪問一個資料塊時,會先查詢buffer cache中是否存在這個資料塊的拷貝,如果已經存在(命中),他就直接從記憶體中讀取資料塊,如果未命中,則需要先從資料檔案中讀取該資料塊到buffer cache中,然後再訪問該資料塊。

通常可以用下列程式碼來檢視例項啟動到目前為止的命中率情況:

SQL> select 1 - (sum(decode(name, 'physical reads', value, 0)) /

  2         (sum(decode(name, 'db block gets', value, 0)) +

  3         (sum(decode(name, 'consistent gets', value, 0))))) "Buffer Hit Ratio"

  4    from v$sysstat;

 

Buffer Hit Ratio

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

      .932341968

 

SQL>

Oracle對於buffer cache的管理是通過兩個重要的連結串列實現的:寫連結串列和最近最少使用連結串列(the least recently used LRU)

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

相關文章