SGA:當一個實例啓動的時候分配(allocated),是一個實例的基本組成部分。
PGA:當一個Server Process啓動的時候分配。Server Process上面已經講到。
Memory -> SGA
SGA是動態的,可以通過SGA_MAX_SIZE參數來設置大小。SGA的增大和縮小有一個基本的單位granule。
在Sql plus我們可以查看SGA分配和granule。
SQL> show sga
SQL> select component,granule_size from
2 v$sga_dynamic_components;
SGA還有它的組成部件,這裏主要介紹Shared Pool,Large Pool和Java Pool。當然還包括一些其他的buffer和cache,如Data Buffer Cache.在Oracle11g還多了Stream Pool。
Large Pool和Java Pool是SGA中可選的內存結構。前者在備份和IO處理以及並行操作時會用到,後者在使用Java的時候會用到。
Memory -> SGA -> Shared Poll
Shared Pool主要用來存儲最近執行的絕大多數的SQL語句和最近使用的數據定義(data definitions)。我們可以通過SHARED_POOL_SIZE來設置其大小。語句爲:ALERT SYSTEM SET SHARED_POOL_SIZE = 64M;Shared Pool包括兩個主要的影響性能的內存結構:Library Cache和Data Dictionary Cache。
Libray Cache用來存儲絕大多數的最近使用的SQL和PL/SQL語句,並提供最近使用語句的共享。它主要包括Shared SQL area和Shared PL/SQL area。它的大小是由Shared Pool決定的,它由最少最近使用機制管理(Least recently used,LRU algorithm)。
Data Dictionary Cache是一個存儲大多數最近使用數據庫中的定義的集合,包括數據庫文件,表,列,用戶,權限等的信息。它爲server process提供對象名稱解析和訪問驗證(validate access)。它的大小也由Shared Pool決定。
Shared Pool還存儲一些數據塊(data blocks)和重做日誌緩衝。
Memory -> PGA
每一個連接到Oracle數據庫的用戶都會有一個自己的PGA。它隨用戶進程的創建而創建,隨用戶進程的終結而終結。