您好,登錄后才能下訂單哦!
一、內存結構
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
1.jpeg
2.jpeg
3.jpeg
4.jpeg
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。