記憶體管理簡介

lishiran發表於2007-04-09
對於oracle的記憶體的管理,截止到9iR2,都是相當重要的環節,管理不善,將可能給資料庫帶來嚴重的效能問題。下面我們將一步一步就記憶體管理的各個方面進行探討。[@more@]

l 概述

oracle的記憶體可以按照共享和私有的角度分為系統全域性區和程式全域性區,也就是SGA和PGA(process global area or private global area)。對於SGA區域內的記憶體來說,是共享的全域性的,在UNIX上,必須為oracle設定共享記憶體段(可以是一個或者多個),因為oracle在UNIX上是多程式;而在WINDOWS上oracle是單程式(多個執行緒),所以不用設定共享記憶體段。PGA是屬於程式(執行緒)私有的區域。在oracle使用共享伺服器模式下(MTS),PGA中的一部分,也就是UGA會被放入共享記憶體large_pool_size中。

對於SGA部分,我們透過sqlplus中查詢可以看到:

SQL> select * from v$sga;

NAME VALUE

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

Fixed Size 454032

Variable Size 109051904

Database Buffers 385875968

Redo Buffers 667648

Fixed Size

oracle 的不同平臺和不同版本下可能不一樣,但對於確定環境是一個固定的值,裡面儲存了SGA各部分元件的資訊,可以看作引導建立SGA的區域。

Variable Size

包含了shared_pool_size、java_pool_size、large_pool_size等記憶體設定和用於管理資料緩衝區等記憶體結構的hash table、塊頭資訊(比如x$bh消耗記憶體)等

Database Buffers

指資料緩衝區,在8i中包含default pool、buffer_pool_keep、buffer_pool_recycle三部分記憶體。在9i中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。這裡要注意在8i中三部分記憶體總和為db_block_buffers*db_block_size。

Redo Buffers

指日誌緩衝區,log_buffer。在這裡要額外說明一點的是,對於v$parameter、v$sgastat、v$sga查詢值可能不一樣。v$parameter裡面的值,是指使用者在初始化引數檔案裡面設定的值,v$sgastat是oracle實際分配的日誌緩衝區大小(因為緩衝區的分配值實際上是離散的,也不是以block為最小單位進行分配的),v$sga裡面查詢的值,是在oracle分配了日誌緩衝區後,為了保護日誌緩衝區,設定了一些保護頁,通常我們會發現保護頁大小大約是11k(不同環境可能不一樣)。參考如下內容

SQL> select substr(name,1,10) name,substr(value,1,10) value

2 from v$parameter where name = 'log_buffer';

NAME VALUE

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

log_buffer 524288

SQL> select * from v$sgastat ;

POOL NAME BYTES

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

fixed_sga 454032

buffer_cache 385875968

log_buffer 656384

SQL> select * from v$sga;

NAME VALUE

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

Fixed Size 454032

Variable Size 109051904

Database Buffers 385875968

Redo Buffers 667648

關於各部分記憶體的作用,參考oracle體系結構,在此不再敘述。

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

相關文章