oracle中的sga和pga
oracle中的sga包含了幾個主要的部分
1.shared pool 共享池
2.database buffer cache 數(shù)據(jù)庫高速緩沖區(qū)
3.redo log buffers 重做日志緩沖區(qū)
4.large pool 大池
5.java pool java池
a.shared pool:
oracle shared pool包括library cache(庫緩存)和dictionary cache(數(shù)據(jù)字典高速緩存)
library cache中包含了共享sql區(qū)和共享pl/sql區(qū)兩部分,他們分別存放sql和pl/sql語句以及相關的信息。oracle通過一個稱為LRU(least recently used)隊列的算法來實現(xiàn)對library cache管理的。其算法大致如下:剛剛使用過的內存塊(的地址)放在LRU隊列的頭上,當一個服務器進程需要library cache的內存空間時該進程就從LRU對列的尾部獲取所需的內存塊,這些內存塊一旦被使用他們(的地址)就立即放在LRU對列的最前面,這樣那些長時間沒有使用過的內存塊將自然地移動到LRU對列的尾部而最先被使用。為了能夠共享sql和pl/sql的代碼,library cache要足夠大。不過oracle并沒有修改library cache大小的參數(shù)。只能間接地通過修改shared pool來修改library cache的大小。長時間的使用shared pool會產生許多碎片如果在shared pool中沒有足夠的連續(xù)空間來裝載目標數(shù)據(jù)就會產生錯誤,所以oracle提供了flush_shared_pool參數(shù)來刷新shared pool
語句:
alter system set shared_pool_size=48M;
alter system flush_shared_pool;
dictionary cache:數(shù)據(jù)庫對象的信息存儲在數(shù)據(jù)字典表中,當數(shù)據(jù)庫需要這些信息的時候,將讀取字典表并將返回的數(shù)據(jù)存儲在dictionary cache中。dictionary cache也是通過LRU算法來使用數(shù)據(jù)塊。dictionary cache是shared pool的一部分,不能單獨設置其大小,只能同過修改shared_pool_size參數(shù)在修改。當查詢數(shù)據(jù)字典的速度緩慢時,應該加大shared_pool_size。
b.database buffer cache:
oracle修改數(shù)據(jù)時,服務器進程將首先在database buffer cache中搜索所需要的數(shù)據(jù),如果找到了就直接使用而不進行磁盤搜索,如果沒有找到就進行磁盤操作,把數(shù)據(jù)文件中的數(shù)據(jù)讀入到database buffer cache中。修改后,當達到一定條件時,會由DBWn進程負責把database buffer cache中的數(shù)據(jù)寫入到數(shù)據(jù)文件中。oracle也是使用LRU算法來實現(xiàn)對database buffer cache的管理的??梢允褂胐b_block_size和db_block_buffers來設置database buffer cache的大小,其中db_block_size是在創(chuàng)建數(shù)據(jù)庫時固定了的,創(chuàng)建完數(shù)據(jù)庫后不可修改。而db_block_buffers的算法是48M/db_block_size。如果SGA的大小不足以容納所使用的數(shù)據(jù),那么其他緩沖區(qū)將爭用database buffer cache的空間,使數(shù)據(jù)庫性能下降。多個程序共享一個SGA時易出現(xiàn)這種現(xiàn)象。 當什么時候DBWn進程才將database buffer cache中的數(shù)據(jù)寫入到數(shù)據(jù)文件中呢 :
1.Checkpoint的時候
2.當buffer cache中沒有足夠的free buffer的時候。
c.redo log buffers:
當數(shù)據(jù)庫中的數(shù)據(jù)被修改時,后臺進程LGWR將修改的內容,記錄到redo log中,以便在數(shù)據(jù)庫恢復過程中實現(xiàn)回滾。然而在被寫入到redo log之前,事物首先被記錄在redo log buffers中。當達到一定條件后將激活LGWR進程來寫入redo log文件中。而這幾個條件分別是:
1.發(fā)生提交。
2.到達LGWR非活動時限。
3.redo log buffers中的數(shù)據(jù)達到redo log buffers 1/3時。
4.DBWn在檢查點完成database buffer cache的刷新。
d.large pool:
Large Pool是一種類似共享池的SGA緩沖池,和共享池不同的是,只有少量類型的對象可以在Large Pool中創(chuàng)建。Large Pool的空間不在共享池中分配,是在數(shù)據(jù)庫啟動的時候另外分配的。Large Pool的大小由LARGE_POOL_SIZE確定。Oracle數(shù)據(jù)庫也可以不配置Large Pool。從Oracle 8開始,Oracle數(shù)據(jù)庫引入了Large Pool,在Oracle 8中,Large Pool的主要功能由兩個:
1.為MTS(共享服務器的早期版本)模式的會話分配UGA空間.
2.作為連續(xù)文件IO的緩沖,比如系統(tǒng)管理的恢復和rman備份恢復(當RMAN使用了多個IO SLAVES的時候)
在一般情況下LARGE POOL使用需求不大,因此不必要設置過大的LARGE POOL.
e.java pool:
引入java pool的目的是能夠編譯java語言的命令,如果要使用java語言,就必須要設置java pool。java語言早oracle數(shù)據(jù)庫中的存儲于pl/sql語言幾乎完全相同。可以通過參數(shù)java_pool_size的值來設置java pool的大小,其單位是字節(jié)(bytes)。在oracle9i中java pool的默認大小是24M。
PGA
(Program Global Area程序全局區(qū))是一塊包含一個服務進程的數(shù)據(jù)和控制信息的內存區(qū)域。它是Oracle在一個服務進程啟動是創(chuàng)建的,是非共享的。一個Oracle進程擁有一個PGA內存區(qū)。一個PGA也只能被擁有它的那個服務進程所訪問,只有這個進程中的Oracle代碼才能讀寫它。因此,PGA中的結構是不需要Latch保護的。
我們可以設置所有服務進程的PGA內存總數(shù)受到實例分配的總體PGA(Aggregated PGA)限制。
在專有服務器(Dedicated Server)模式下,Oracle會為每個會話啟動一個Oracle進程;
而在多線程服務(Multi-Thread Server MTS)模式下,由多個會話共享同一個Oracle服務進程。
PGA中包含了關于進程使用到的操作系統(tǒng)資源的信息,以及一些關于進程狀態(tài)的信息。
而關于進程使用的Oracle共享資源的信息則是在SGA中。
這樣做可以使在進程以外中止時,能夠及時釋放和清除這些資源。
相關視圖
V$PGASTAT
V$PGASTAT提供了PGA內存使用情況的統(tǒng)計信息和當自動PGA內存管理啟動時的統(tǒng)計信息。
視圖里面的累加數(shù)據(jù)是自從實例啟動后開始累加的。
V$SYSSTAT,V$SESSTAT
這兩個視圖顯示了系統(tǒng)(會話)的統(tǒng)計數(shù)據(jù)。他們的統(tǒng)計項目基本相同,
但不同之處在于一個是系統(tǒng)級的、一個是會話級的。
V$PROCESS
這個視圖顯示了所有Oracle進程的信息。其中以下幾個字段則說明了進程PGA內存的使用情況。
PGA_USED_MEM:進程使用的PGA內存
PGA_ALLOCATED_MEM:分配給進程的PGA內存
PGA_MAX_MEM:進程使用的最大的PGA內存
轉載于:https://www.cnblogs.com/alex-blog/articles/2470768.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的oracle中的sga和pga的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 母版事件中注册javascript脚本
- 下一篇: sharepoint安装心得_过程