Oracle數(shù)據(jù)庫SGA的一些筆記
SGA 和Oracle的每一個實例對應(yīng),實例啟用則系統(tǒng)分配一個SGA,在實例關(guān)閉的時候回收。服務(wù)器端所有的歷程以及Oracle的后臺歷程均可拜會SGA,局部的歷程有寫SGA的權(quán)限。 SGA中有一局部的內(nèi)存,叫做Fixed SGA,其中包括了數(shù)據(jù)庫實例的事態(tài)。
SGA 包括以下幾個局部:
Buffer Cache
重要儲藏block數(shù)據(jù)的拷貝,對所有用戶分享。 在這個cache中所有的block重要以兩個隊列的數(shù)據(jù)構(gòu)造保留。
Write List: 儲藏一些曾經(jīng)被修正的數(shù)據(jù)(dirty data)。
LRU List: 保留三局部消息: 空block, pinned buffer(猜該當是沒修正的,正處理的),dirty buffer(還未曾被遷移到Write List-- 這里就能夠看出把buffer從LRU List到Write List的挪動并不是實時的,而是有一個引發(fā)的過程1)。
流程描寫如下:一個DB的process試圖讀取一個block的內(nèi)容,率先會查詢buffer cache看里面是否有對應(yīng)的block, 萬一有則直接讀取(cache hit),萬一未曾的話,就會在LRU List里面從LRU端開始尋找輕便的空buffer,萬一碰到了Dirty Buffer,則移到Write List(解釋了上標1),然后繼續(xù)尋找。萬一找到輕便的free buffer,就將block裝載到buffer cache中,萬一最后未曾找到,就動身DBW0事件,將dirty buffer寫入到磁盤中。
等閑理況下buffer cahce會將新的block儲藏的LRU的MRU端(最新拜會),然而萬一是全表掃描,則會將新讀入的blocks納入到LRU端(全表掃都是多個blocks同時讀取,而非單block讀取--參見書COB第19頁)。萬一想要全表掃時放到MRU端,則需在select語句中指定利用'cache'。例如:SELECT last_name FROM employees hr_emp;
Redo Log Buffer
儲藏一些redo的消息,這些消息能夠redo語句insert/update/delete/alter/create/drop,redo buffer是由db process從用戶內(nèi)存中拷貝到redo log buffer,這個buffer挪借了繼續(xù)的空間,redo log buffer由LGWR寫到redo log中。
Share Pool
重要包括Library cache,Data cache,result cache(11g新出來的)。
Library cache 包括Shared SQL areas,Private SQL areas (萬一是利用shared server),pl/sql的procedure和package,以及一些扼制消息例如鎖,最后還有l(wèi)ibrary cache的handle。
Share SQL Area是針對所有用戶,而Private SQL Area對每一個用戶都有一個獨自的copy.華擎在Shared SQL Area中,Oracle存儲sql的分析樹和厲行計劃,當一個新的sql被分析時,Oracle從Share SQL Area中分配一個空間,空間大小隨sql的混雜度而改變,萬一空間不足www.d1am.com的話,Oracle會依據(jù)LRU算法釋放本來挪借的空間而分配給新的sql.
對于一些plsql過程段,oracle也是一樣看待,在Share SQL Area中分析,在Private SQL Area中存儲相干的變量及SQL的厲行空間。在PLSQL過程段中的sql,也會分配一個自力更生的Share SQL Area 和Private SQL Area.
刷新share sql area的幾個措施:
1.利用analyze 語句。
2.sql中引用的對象被改換。
3.database 的 global name被改換。
4.alter system flush shared_pool。
關(guān)于Oracle數(shù)據(jù)庫SGA的知識的總結(jié)就介紹這么多,希望能夠帶給您一些收獲吧。
【編輯推薦】






