oracle內存結構

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

 

 

當用戶進程鏈接到數據庫並建立一個對應的會話時,Oracle服務進程會爲這個用戶專門設置 一個PGA區,用來存儲這個用戶會話的相關內容。當這個用戶會話終止時,數據庫系統會自動釋放這個PAG區所佔用的內存。這個PGA區對於數據庫的性能有 比較大的影響,特別是對於排序操做的性能。因此,在必要的時候合理管理PGA區,可以在很大程度上提升數據庫的性能。

1、PGA與SGA的區別。
mysql

  PGA(程序緩存區)與SGA(系統全局區)相似,都是Oracle數據庫系統爲會話在 服務器內存中分配的區域。不過二者的做用不一樣,共享程度也不一樣。SGA系統全局區顧名思義,是對系統內的全部進程都是共享的。當多個用戶同時鏈接到一個例 程時,全部的用戶進程、服務進程均可以共享使用這個SGA區。爲此這個SGA的主要用途就是爲不一樣用戶之間的進程與服務進程提供一個交流的平臺。除了這個 做用,另外有一個重要的做用就是各類數據庫的操做主要就是在這個SGA區內完成。

  而PGA程序緩衝區則主要是爲了某個用戶進程所服務的。這個內存區不是共享的,只有這個用戶的服務進程自己纔可以訪問它本身的PGA區。作個形象的比 喻,SGA就好像是操做系統上的一個共享文件夾,不一樣用戶能夠以此爲平臺進行數據方面的交流。而PGA就好像是操做系統上的一個私有文件夾,只有這個文件 夾的全部者纔可以進行訪問,其餘用戶都不可以訪問。雖然程序緩存區不像其餘用戶的進程開放,可是這個內存區仍然肩負着一些重要的使命,如數據排序、權限控 制等等都離不開這個內存區。

2、 爲排序設置合理的排序區大小(SORT AREA)。sql


  當用戶須要對某些數據進行排序時,數據庫是如何處理的呢?首先,數據庫系統會將須要排序的數據保存到PGA程序緩存區中的一個排序區內。而後再在這個 排序區內對這些數據進行排序。如須要排序的數據有2M,那麼排序區內必須至少要有2M的空間來容納這些數據。而後排序過程當中又須要有2M的空間來保存排序 後的數據。因爲系統從內存中讀取數據比從硬盤中讀取數據的速度要快幾千倍,爲此若是這個數據排序與讀取的操做都可以在內存中完成,無疑能夠在很大程度上提 高數據庫排序與訪問的性能。若是這個排序的操做都可以在內存中完成,顯然這是很理想的。可是若是PGA區中的排序區容量不夠,不可以容納排序後的數據,那 會如何呢?此時,系統會從硬盤中獲取一個空間,用來保存這須要排序的數據。此時排序的效率就會下降許多。爲此在數據庫管理中,若是發現用戶的不少操做都需 要用到排序,那麼用戶會設置比較大的排序區,能夠提升用戶訪問數據的效率。

  在Oracle數據庫中,這個排序區主要用來存放排序操做產生的臨時數據。通常來講,這個排序區的大小佔據這PGA程序緩存取的大部分空間,這是影響 PGA區大小的主要因素。在小型應用中,數據庫管理員能夠直接採用其默認的值。可是在一些大型的應用中,或者須要進行大量記錄排序操做的數據庫系統中,管 理員可能須要手工調整這個排序區的大小,以提升排序的性能。若是系統管理員須要調整這個排序區大小的話,須要經過初始化參數SORT_AREA_SIZE 來實現。爲了提升數據訪問與排序的性能,數據庫系統利用內存比硬盤要快幾千倍的實施,會將準備排序的數據臨時存放到這個排序區,並在排序區內完成數據的排 序。管理員須要牢記這個原則,並在適當的狀況下調整排序區的大小,以提升數據訪問與數據排序的性能。

3、 會話區保存着用戶的權限等重要信息(USER SESSON DATA)。

  在程序緩存區內還包含着一個會話區。雖然絕大部分狀況下,管理員不要維護這個會話區,可讓數據庫系統進行維護。可是,管理員仍是須要了解一下這個會 話區的做用。由於這個會話區直接關係着數據庫系統中數據的安全性。數據庫系統不只是存放數據的一個很好的載體,並且在還提供了一個統一管理數據的平臺,可 以根據實際須要,爲不一樣的用戶設置不一樣的訪問權限。簡單的說,在數據庫中能夠控制用戶能夠訪問哪些數據。從而提升數據的安全性。

  當用戶進程與數據庫創建會話時,系統會將這個用戶的相關權限查詢出來,而後保存在這個會話區內。如此的話,用戶進程在訪問數據時,系統就會覈對會話區 內的用戶權限信息,看看其是否具備相關的訪問權限。因爲系統將這個用戶的權限信息存放在內存上,因此其核對用戶權限的速度很是的快。由於系統不用再去硬盤 中讀取數據,直接從內存中讀取。而從內存讀取數據的效率要比硬盤上快幾千倍。

  一般狀況下,這個會話區內保存了會話所具備的權限、角色、性能統計等信息。這個會話區通常都是由數據庫進行自我維護的,系統管理員不用幹預。

4、 堆棧區保存變量信息(STACK SPACE)。

  有時候爲了提升SQL語句的重用性,會在語句中使用綁定變量。簡單的說,就是SQL語句能夠接受用戶傳入的變量。從而用戶只須要輸入不一樣的變量值,就 能夠知足不一樣的查詢需求。如如今用戶須要查詢全部員工的信息。而後其又要查詢全部工齡在3年以上的員工等等。此時其實他們採用的是同一個SQL語句,只是 傳遞給系統的變量不一樣而已。這能夠在很大程度上下降數據庫開發的工做量。這個變量在Oracle數據庫系統中就叫作綁定變量。利用綁定變量能夠增強與用戶 的互動性。另外在這個堆棧區內還保存着會話變量、SQL語句運行時的內存結構等重要的信息。

  一般狀況下,這個堆棧區跟上面講到的會話區同樣,均可以讓數據庫系統進行自我維護,而管理員不用參與到其中。這些分區的大小,也是系統根據實際狀況來進行自動分配的。當這個用戶會話結束時,系統會自動釋放這些區所佔用的空間。
5、 遊標區 (CURSOR STATE)。

  不管是SQLServer數據庫仍是Oracle數據庫中,有時候都須要用到遊標技術。當運行使用遊標的語句時,Oracle數據庫系統會在程序緩存 區中間爲其分配一塊區域。這塊區域就叫作遊標區。一般狀況下,遊標用來完成一些比較特殊的功能。並且通常來講,採用遊標的語句要比其餘語句的執行效率低一 點。爲此管理員在使用遊標的時候,仍是須要慎重。

  遊標區是一個動態的區域。當用戶執行遊標語句時,系統就會在這個遊標區內建立一個區域。當關閉遊標時,這個區域就會被釋放。這建立與釋放,須要佔用一 定的系統資源,花費必定的時間。爲此在使用遊標時,若是頻繁的打開和關閉遊標,就會下降語句的執行性能。因此筆者建議,在寫語句時,若是真的有必要使用遊 標技術時,則要注意遊標不要頻繁的打開和關閉。

  另外在Oracle數據庫中,還能夠經過限制遊標的數量來提升數據庫的性能。如在數據庫系統中有一個初始化參數OPEN_CURSORS。管理員能夠 根據實際的須要,來設置這個參數,控制用戶可以同時打開遊標的數目。不過須要注意的是,在確實須要纔有遊標的狀況下,若是硬件資源可以支持的話,那麼就需 要放寬這個限制。這能夠避免用戶進程頻繁的打開和關閉遊標。由於頻繁的打開和關閉遊標這對遊標的操做是不利的,會影響數據庫的性能。

  從以上的分析中能夠看出,程序全局區(PGA)主要包含排序區、會話區、堆棧區和遊標區四個部分的內容,他們各司其職,完成用戶進程與數據庫之間的會 話。一般狀況下,系統管理員主要關注的是排序區,在必要時須要手工調整這個排序區的大小。另外須要主要的是,遊標區是一個動態的區域,在遊標打開時建立, 關閉時釋放。故在數據庫開發時,不要頻繁的打開和關閉遊標能夠提升遊標操做的效率,改善數據庫的性能。其餘分區的內容管理員只須要了解其用途,平常的維護 交給數據庫系統來完成便可。

 設置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_targetsga_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
數據庫裝載完畢。
數據庫已經打開。

相關文章
相關標籤/搜索