Oracle之內存結構(SGA、PGA)

 


一、內存結構

SGA(System Global Area):由所有服務進程和後臺進程共享;
PGA(Program Global Area):由每個服務進程、後臺進程專有;每個進程都有一個PGA。


二、SGA
包含實例的數據和控制信息,包含如下內存結構:
1)Database buffer cache:緩存了從磁盤上檢索的數據塊。
2)Redo log buffer:緩存了寫到磁盤之前的重做信息。
3)Shared pool:緩存了各用戶間可共享的各種結構。
4)Large pool:一個可選的區域,用來緩存大的I/O請求,以支持並行查詢、共享服務器模式以及某些備份操作。
5)Java pool:保存java虛擬機中特定會話的數據與java代碼。
6)Streams pool:由Oracle streams使用。
7)Keep buffer cache:保存buffer cache中存儲的數據,使其盡時間可能長。
8)Recycle buffer cache:保存buffer cache中即將過期的數據。
9)nK block size buffer:爲與數據庫默認數據塊大小不同的數據塊提供緩存。用來支持表空間傳輸。

database buffer cache, shared pool, large pool, streams pool與Java pool根據當前數據庫狀態,自動調整;
keep buffer cache,recycle buffer cache,nK block size buffer可以在不關閉實例情況下,動態修改。


三、PGA
每個服務進程私有的內存區域,包含如下結構:
1)Private SQL area:包含綁定信息、運行時的內存結構。每個發出sql語句的會話,都有一個private SQL area(私有SQL區)
2)Session memory:爲保存會話中的變量以及其他與會話相關的信息,而分配的內存區。


四、SGA COMPONENT
(一)、Buffer Cache
1、DB_CACHE_SIZE
    通過參數DB_CACHE_SIZE可指定DB buffer cache的大小
    ALTER SYSTEM SET DB_CACHE_SIZE=20M scope=both;
    服務進程從數據文件讀數據到buffer cache;DBWn從buffer cache寫數據到數據文件。
    buffer cache的四種狀態:
        1)pinned:當前塊正在讀到cache或正寫到磁盤,其他會話等待訪問該塊。
        2)clean:
        3)free/unused:buffer內爲空,爲實例剛啓動時的狀態。
        4)dirty:髒數據,數據塊被修改,需要被DBWn刷新到磁盤,才能執行過期處理。

同一個數據庫中,支持多種大小的數據塊緩存。通過DB_nK_CACHE_SIZE參數指定,如
    • DB_2K_CACHE_SIZE
    • DB_4K_CACHE_SIZE
    • DB_8K_CACHE_SIZE
    • DB_16K_CACHE_SIZE
    • DB_32K_CACHE_SIZE
標準塊緩存區大小由DB_CACHE_SIZE指定。如標準塊爲nK,則不能通過DB_nK_CACHE_SIZE來指定標準塊緩存區的大小,應由DB_CACHE_SIZE指定。
例,標準塊爲8K,則數據庫可以設置的塊緩存大小的參數如下:
    • DB_CACHE_SIZE (指定標準塊(這裏爲8K)的緩存區)
    • DB_2K_CACHE_SIZE (指定塊大小爲2K的緩存區)
    • DB_4K_CACHE_SIZE (指定塊大小爲4K的緩存區)
    • DB_16K_CACHE_SIZE (指定塊大小爲16K的緩存區)
    • DB_32K_CACHE_SIZE (指定塊大小爲32K的緩存區)

2、多種緩衝池(buffer pool)
    1)Keep:通過db_keep_cache_size參數指定。
    該buffer內的數據可能被重用,以降低I/O操作。該池的大小要大於指定到該池的段的總和。
       讀入到keep buffer的塊不需要過期操作。
    2)Recycle:通過db_recycle_cache_size參數指定。
    該池中的數據被重用機會較小,該池大小要小於分配到該池的段的總和。讀入該池的塊需要經常執行過期處理。
    3)Default:相當於一個沒有Keep與Recycle池的實例的buffer cache,通過db_cache_size參數指定。

3、爲對象明確指定buffer pool
    buffer_pool子句,用來爲對象指定默認的buffer pool,是storage子句的一部分。
       對create與alter table、cluster、index語句有效。
    如果現有對象沒有明確指定buffer pool,則默認都指定爲default buffer pool,大小爲DB_CACHE_SIZE參數設置的值。
語法:
    a.CREATE INDEX cust_idx ON tt(id) STORAGE (BUFFER_POOL KEEP);
    b.ALTER TABLE oe.customers STORAGE (BUFFER_POOL RECYCLE);
    c.ALTER INDEX oe.cust_lname_ix STORAGE (BUFFER_POOL KEEP);
(二)、Share Pool
1、SHARE_POOL_SIZE
   1)Share Pool可通過SHARE_POOL_SIZE參數指定:
  SQL> alter system set shared_pool_size=20M scope=both;
   2)Share Pool保存的信息被多個會話共享,類型包括:
  a.Library Cache
Library Cache又包含共享SQL區與PL/SQL區:
a).共享SQL區保存了分析與編譯過的SQL語句。
b).PL/SQL區保存了分析與編譯過的PL/SQL塊(過程和函數、包、觸發器與匿名PL/SQL塊)。
  b.Data Dictionary Cache
保存了數據字典對象的定義。
  c.UGA(User Global Area)
UGA內包含了共享服務器模式下的會話信息。
共享服務器模式時,如果large pool沒有配置,則UGA保存在Share Pool中。

(三)、Large Pool  
1)Large Pool大小通過LARGE_POOL_SIZE參數指定:
SQL> alter system set large_pool_size=20m scope=both;
2)作用:
a.爲I/O服務進程分配內存
b.爲備份與恢復操作分配內存
c.爲Oracle共享服務器模式與多個數據庫間的聯機事務分配內存。
通過從large pool中爲共享服務器模式分配會話內存,可以減少share pool因頻繁爲大對象分配和回收內存而產生的碎片。將大的對象從share pool中分離出來,可以提高shared pool的使用效率,使其可以爲新的請求提供服務或者根據需要保留現有的數據。

(四)、Java Pool           
1、JAVA_POOL_SIZE
     通過JAVA_POOL_SIZE參數指定java pool大小。
          保存了jvm中特定會話的java code和數據。
2、在編譯數據庫中的java代碼和使用數據庫中的java資源對象時,都會用到share pool。
        java的類加載程序對每個加載的類會使用大約8K的空間。
       系統跟蹤運行過程中,動態加載的java類,也會使用到share pool。

(五)、Redo Log Buffer
1、服務進程從用戶空間拷貝每條DML/DDL語句的redo條目到redo log buffer中。
2、redo log buffer是一個可以循環使用的buffer,服務進程拷貝新的redo覆蓋掉redo log buffer中已通過LGWR寫入磁盤(online redo log)的條目。
3、導致LGWR執行寫redo log buffer到online redo log的條件
a.用戶執行事務提交commit
b.每3秒鐘或redo log buffer內已達到1/3滿或包含1MB數據
c.DBWn進程將修改的緩衝區寫入磁盤時(如果相應的重做日誌數據尚未寫入磁盤)

(六)、ASMM(Automatic Shared Memory Management)
1、SGA_TARGET
      1)SGA_TARGET默認值爲0,即ASMM被禁用。需要手動設置SGA各中各組件的大小。
      2)當SGA_TARGET爲非0時,則啓用ASMM,自動調整以下各組件大小:
    DB buffer cache(default pool)
    shared pool
    large pool
    streams pool
    java pool
           但ASSM中, 以下參數仍需要手動指定:
    log buffer
    keep、recycle、以及非標準塊緩衝區
    固定SGA以及其他內部分配。
2、啓用ASMM需要將STATISTICS_LEVEL設置成TYPICAL或ALL
3、啓用ASMM,自動調整SGA內部組件大小後。若手動指定某一組件值,則該值爲該組件的最小值。如
手動設置SGA_TARGET=8G,SHARE_POOL_SIZE=1G,則ASMM在自動調整SGA內部組件大小時,保證share pool不會低於1G。
SQL> SELECT component, current_size/1024/1024 size_mb FROM   v$sga_dynamic_components;
4、SGA_MAX_SIZE
SGA_MAX_SIZE指定內存中可以分配給SGA的最大值。
SGA_TARGET是一個動態參數,其最大值爲SGA_MAX_SIZE指定的值。

五、PGA

 
(一)Private SQL Area
1、保存了當前會話的綁定信息以及運行時內存結構。這些信息
2、每個執行sql語句的會話,都有一個private sql area。
3、當多個用戶執行相同的sql語句,此sql語句保存在一個稱爲shared sql area。此share sql area被指定給這些用戶的private sql area
4、共享服務器模式:private sql area位於SGA的share pool或large pool中
     專用服務器模式:private sql area位於PGA中
(二)Cursor、SQL Areas
(三)Work Area    
PGA的一大部分被分配給Work Area,用來執行如下操作:
    a.基於操作符的排序,group by、order by、rollup和窗口函數。
      參數爲sort_area_size  
    b.hash散列連接,
      參數爲hash_area_size     
    c.位圖合併,
      參數爲bitmap_merge_area_size
    d.位圖創建,
      參數爲create_bitmap_area_size 
    e.批量裝載操作使用的寫緩存
(四)Session memory
  保存了會話的變量,如登錄信息及其他與會話相關的信息,共享服務器模式下,Session memory是共享的。

(五)自動PGA管理
設置PGA_AGGREGATE_TARGET爲非0,則啓用PGA自動管理,並忽略所有*_area_size的設置。如sort_area_size,hash_area_size等。
默認爲啓用PGA的自動管理,Oracle根據SGA的20%來動態調整PGA中專用與Work Area部分的內存大小,最小爲10MB。
用於實例中各活動工作區(work area)的PGA總量,爲PGA_AGGREGATE_TARGET減去其他組件分配的PGA內存。得到的結果,按照特定需求動態分配給對應的工作區。
1)設置PGA_AGGREGATE_TARGET大小的步驟
a.設置PGA_AGGREGATE_TARGET爲SGA的20%,對於DSS系統,此值可能過低。
b.運行典型的負載,通過oracle收集的pga統計信息來調整PGA_AGGREGATE_TARGET的值。
c.根據oracle的pga建議調整PGA_AGGREGATE_TARGET大小。
2)禁用自動pga管理
爲向後兼容,設置PGA_AGGREGATE_TARGET爲0,即禁用pga的自動管理。可使用關聯的*_area_size參數調整對應工作區的最大大小。
bitmap_merge_area_size
create_bitmap_area_size
hash_area_size
sort_area_size   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章