1、內存結構
SGA(System Global Area):由全部服務進程和後臺進程共享;
PGA(Program Global Area):由每一個服務進程、後臺進程專有;每一個進程都有一個PGA。php
2、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能夠在不關閉實例狀況下,動態修改。html
3、PGA
每一個服務進程私有的內存區域,包含以下結構:
1)Private SQL area:包含綁定信息、運行時的內存結構。每一個發出sql語句的會話,都有一個private SQL area(私有SQL區)
2)Session memory:爲保存會話中的變量以及其餘與會話相關的信息,而分配的內存區。
4、SGA COMPONENT
(一)、Buffer Cache
一、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的緩存區)
二、多種緩衝池(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參數指定。
三、爲對象明確指定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
一、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
一、JAVA_POOL_SIZE
經過JAVA_POOL_SIZE參數指定java pool大小。
保存了jvm中特定會話的java code和數據。
二、在編譯數據庫中的java代碼和使用數據庫中的java資源對象時,都會用到share pool。
java的類加載程序對每一個加載的類會使用大約8K的空間。
系統跟蹤運行過程當中,動態加載的java類,也會使用到share pool。
(五)、Redo Log Buffer
一、服務進程從用戶空間拷貝每條DML/DDL語句的redo條目到redo log buffer中。
二、redo log buffer是一個能夠循環使用的buffer,服務進程拷貝新的redo覆蓋掉redo log buffer中已經過LGWR寫入磁盤(online redo log)的條目。
三、致使LGWR執行寫redo log buffer到online redo log的條件
a.用戶執行事務提交commit
b.每3秒鐘或redo log buffer內已達到1/3滿或包含1MB數據
c.DBWn進程將修改的緩衝區寫入磁盤時(若是相應的重作日誌數據還沒有寫入磁盤)
(六)、ASMM(Automatic Shared Memory Management)
一、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以及其餘內部分配。
二、啓用ASMM須要將STATISTICS_LEVEL設置成TYPICAL或ALL
三、啓用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;
四、SGA_MAX_SIZE
SGA_MAX_SIZE指定內存中能夠分配給SGA的最大值。
SGA_TARGET是一個動態參數,其最大值爲SGA_MAX_SIZE指定的值。
5、PGA
(一)Private SQL Area
一、保存了當前會話的綁定信息以及運行時內存結構。這些信息
二、每一個執行sql語句的會話,都有一個private sql area。
三、當多個用戶執行相同的sql語句,此sql語句保存在一個稱爲shared sql area。此share sql area被指定給這些用戶的private sql area
四、共享服務器模式: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 java
1、PGA與SGA的區別。
mysql
2、 爲排序設置合理的排序區大小(SORT AREA)。sql
設置SGA的原則以及修改它的大小 數據庫
一,設置SGA的原則:
緩存
有時候會碰到在配置SGA中出現了問題,因爲分配的內存過多,數據庫啓不起來了。
並且還要注意,在WINDOWS平臺下,32位的操做系統,SGA分配不能超過1.8G,64位的扛得住一些,因此個人數據庫服務器換成64位的WINDOWS2003了。
內存結構=SGA(系統全局區)+PGA(程序全局區)
SGA:是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle 服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,若是實際內存不夠再往虛擬內存中寫。咱們重點就是設置SGA,理論上SGA可佔OS系統物理內存的1/2——1/3
原則:SGA+PGA+OS使用內存 <總物理RAM
SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
一、SGA系統全局區.(包括如下五個區)
A、數據緩衝區:(db_block_buffers)存儲由磁盤數據文件讀入的數據。
大小: db_block_buffers*db_block_size
Oracle9i設置數據緩衝區爲:Db_cache_size
原則:SGA中主要設置對象,通常爲可用內存40%。
B、共享池:(shared_pool_size):數據字典,sql緩衝,pl/sql語法分析.加大可提速度。
原則:SGA中主要設置對象,通常爲可用內存10%
C、日誌緩衝區:(log_buffer)存儲數據庫的修改信息.
原則:128K ---- 1M 之間,不該該太大
D 、JAVA池(Java_pool_size)主要用於JAVA語言的開發.
原則:若不使用java,原則上不能小於20M,給30M一般就夠了
E、 大池(Large_pool_size) 若是不設置MTS,主要用於數據庫備份恢復管理器RMAN。
原則:若不使用MTS,5---- 10M 之間,不該該太大
SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
原則: 達到可用內存的55-58%就能夠了.
二、PGA程序全局區
PGA:包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反PGA 是隻被一個進程使用的區域,PGA 在建立進程時分配在終止進程時回收.
A、Sort_area_size 用於排序所佔內存
B、Hash_area_size 用於散列聯接,位圖索引
這兩個參數在非MTS下都是屬於PGA ,不屬於SGA,是爲每一個session單獨分配的,在咱們的服務器上除了OS + SGA,必定要考慮這兩部分
原則:OS 使用內存+SGA+併發執行進程數*(sort_area_size+hash_ara_size+2M) < 0.7*總內存
實例配置
一:物理內存多大
二:操做系統估計須要使用多少內存
三:數據庫是使用文件系統仍是裸設備
四:有多少併發鏈接
五:應用是OLTP 類型仍是OLAP 類型
基本掌握的原則是, db_block_buffer 一般能夠儘量的大,shared_pool_size 要適度,log_buffer 一般大到幾百K到1M就差很少了
例如:
內存2G 單個CPU db_block_size 是8192 bytes
SGA=0.55*2048M=1126.4M左右
建議 shared_pool_size = 200M , db_block_buffer *db_block_size = 800M
具體: shared_pool_size=209715200 #200M
db_block_buffer=103192 #800M
log_buffer = 131072 # 128k (128K*CPU個數)
large_pool_size= 31457280 #30M
java_pool_size = 20971520 # 20 M
sort_area_size = 524288 # 512k (65k--2M)
sort_area_retained_size = 524288 # MTS 時 sort_area_retained_size = sort_area_size安全
二,修改SGA的大小:服務器
1.sga_target不能大於sga_max_size,能夠設置爲相等。
2.SGA加上PGA等其餘進程佔用的內存總數必須小於操做系統的物理內存。
作以下操做前,必須備份dbs目錄下的全部文件。
方法一:直接SQL命令行修改:
SQL>alter system set sga_target=1024m scope=spfile;
SQL>alter system set sga_max_size=1024m scope=spfile;
(若是spfile文件不存在,需先建立createspfile from pfile;)
alter system set sga_target=12g scope=spfile;
alter system set sga_max_size=12g scope=spfile;session
而後
SQL>shutdown immediate
SQL>startup
SQL>show sga; 便可看到SGA的大小已經被修改
方法二:經過EM修改:
以SYS登錄到EM:管理->(數據庫配置)全部初始化參數—>SPFile->
在此界面能夠直接定義sga_target與sga_max_size
而後重啓數據庫便可!
文章出處:http://www.diybl.com/course/7_databases/oracle/Oracleshl/200866/123114.html
cmd下部分操做:,oracle10.2.0g
SQL>conn sys/rezin as sysdba
已鏈接。
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
Oracle 例程已經關閉。
SQL> startup
ORACLE 例程已經啓動。
TotalSystem Global Area 1073741824 bytes
FixedSize 1253124 bytes
VariableSize 696254716 bytes
Database Buffers 369098752 bytes
RedoBuffers 7135232 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> show sga;
TotalSystem Global Area 1073741824 bytes ---原來大小
FixedSize 1253124 bytes
VariableSize 696254716 bytes
Database Buffers 369098752 bytes
RedoBuffers 7135232 bytes
SQL> alter system set sga_target=300m scope=spfile;
系統已更改。
SQL>alter system set sga_max_size=280m scope=spfile;
系統已更改。
SQL>shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啓動。
TotalSystem Global Area 314572800 bytes ---修改後的大小
FixedSize 1248720 bytes
VariableSize 96469552 bytes
Database Buffers 209715200 bytes
RedoBuffers 7139328 bytes
數據庫裝載完畢。
數據庫已經打開。