【基礎篇記憶體結構】oracle10g記憶體結構(一)
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_SIZE和SGA_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_sga和pre_page_sga,pre_page_sga預設設定為false,例項啟動時不必將sga全部分配實體記憶體,設定為true則是全部分配,當lock_sga設定為true時,鎖定sga在實體記憶體中,不允許換入和換出。
SGA_TARGET
當設定了SGA_TARGET引數時,資料庫自動啟動了ASMM(自動記憶體管理),oracle將代替人工來控制sga中的buffer pool,shared pool等區域的大小,隨時調節以將系統效能最大化和最合理化。Sga_target的值總是小於或等於sga_max_size。不能指定大於sga_max_size的sga_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=0則sga的容量由多個初始化引數決定,主要有:
DB_CACHE_SIZE 標準容量資料塊使用的快取區的容量
LOG_BUFFER 重做日誌緩衝區的容量,以位元組為單位
SHARED_POOL_SIZE 儲存共享SQL及PLSQL的記憶體容量,以位元組為單位
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記憶體結構記憶體
- Oracle 記憶體結構(一)Oracle記憶體
- 無鎖資料結構(基礎篇):記憶體柵障資料結構記憶體
- PostgreSQL:記憶體結構SQL記憶體
- oracle 記憶體結構Oracle記憶體
- JVM記憶體結構JVM記憶體
- Oracle記憶體結構研究-PGA篇Oracle記憶體
- Oracle記憶體結構研究-SGA篇Oracle記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- 理解JVM(一):記憶體結構JVM記憶體
- 【翻譯】記憶體結構 (一)記憶體
- 基礎知識1——例項記憶體結構記憶體
- 結構體記憶體對齊結構體記憶體
- Oracle記憶體體系結構Oracle記憶體
- Oracle面試寶典-記憶體結構篇Oracle面試記憶體
- oracle 記憶體結構(二)Oracle記憶體
- 調節記憶體結構記憶體
- ORACLE 記憶體結構理解.Oracle記憶體
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- JVM學習(一)——記憶體結構JVM記憶體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- MySQL整體架構與記憶體結構MySql架構記憶體
- Oracle10g data buffer cache的記憶體結構Oracle記憶體
- JVM(七):JVM記憶體結構JVM記憶體
- shared pool記憶體結構記憶體
- oracle 例項記憶體結構Oracle記憶體
- Buffer Cache的記憶體結構記憶體
- db2 記憶體結構DB2記憶體
- oracle記憶體結構與管理Oracle記憶體
- JVM記憶體結構劃分JVM記憶體
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- oracle 記憶體結構具體解釋Oracle記憶體
- [Virtualization]ESXi體系結構與記憶體管理(二)控制記憶體分配記憶體
- [Virtualization]ESXi體系結構與記憶體管理(三)控制記憶體分配記憶體
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- JVM的基本結構和JVM的記憶體結構JVM記憶體
- Oracle例項的程式結構和記憶體結構Oracle記憶體