基礎知識1——例項記憶體結構

與刃爭鋒發表於2014-01-06
例項記憶體結構
instance由系統全域性區SGA的共享記憶體塊以及大量的後臺程式組成.

SGA必須包含:資料庫緩衝區快取DB buffer,日誌緩衝區Log buffer,共享池shared pool.

SGA可能包含:大池large pool,Java池java pool,流池stream pool. 

對這些結構的大小管理,大多可自動完成,DBA也可自行控制,建議使用自動管理.



資料庫緩衝區快取DB Buffer:是oracle執行SQL的區域.更新資料時使用者會話不直接更新磁碟上的資料,包含關鍵資料的資料塊首先複製到資料庫緩衝區快取.更改應用於資料庫緩衝區快取中這些資料塊的副本.此後,塊將在快取中保留一段時間,直至其佔有的緩衝區需要快取另一個塊為止.
查詢資料時,資料也要經過快取.會話計算出哪些塊包含關鍵的行,並將它們複製到資料庫緩衝區快取,此後相關行傳輸到會話的PGA作進一步處理,塊也會在資料庫緩衝區快取中保留一段時間.

為了執行使用者程式提交的select語句,會話的伺服器程式將掃描緩衝區快取包含相關行的資料塊,找到了就會發生一次緩衝區快取命中.如果沒命中,伺服器程式在將結果傳送給使用者程式前,會將包含相關行的資料從資料檔案讀入緩衝區.

如果緩衝區儲存的塊映像與磁碟上的不同,這樣的緩衝區叫"髒緩衝區",當塊第一次複製到其中時,叫"乾淨緩衝區":此時緩衝區塊映像與磁碟上的塊映像是相同的.當塊更新時,緩衝區將變髒.最終,髒緩衝區必須寫回到資料檔案,此時緩衝區又變得乾淨了. 即使寫入磁碟後,此塊也保留在記憶體中一段時間,不會被另一個塊重寫.

資料庫緩衝區快取大腳對效能影響很大.快取應足夠大,便於快取所有頻繁訪問的塊,但又不能過大,快取那些極少使用的塊.

資料庫緩衝區快取在例項啟動時分配,可動態調整其大小,也可進行自動管理.




日誌緩衝區Log Buffer:小型的,用於短期儲存將寫入到磁碟上的重做日誌變更向量的臨時區域.會話伺服器程式不將重做記錄直接寫入重做日誌檔案,會話將重做記錄寫入記憶體中的日誌緩衝區,隨後 日誌緩衝區寫出到重做日誌檔案,會話發出commit語句時,會實時執行日誌緩衝區寫操作,寫操作由日誌寫入器後臺程式(LGWR)完成.

日誌緩衝區比較小,一般為幾MB,預設值由oracle伺服器確定,並取決於伺服器節點中的CPU數量.不能設定小於預設值的日誌緩衝區,如果這麼做,日誌緩衝區一定會被設定為預設大小.

日誌緩衝區在啟動例項時分配,如果不重啟例項,就不能在隨後調整其大小,它是一個迴圈緩衝區.大小固定不變,啟動例項時被設定為預設值,無法對其進行自動管理.


oracle體系結構中,將日誌緩衝區轉儲到磁碟是基本瓶頸之一,DML的速度不能超過LGWR將變更向量轉儲到聯機重做日誌檔案的速度.




共享池:最複雜的SGA結構,簡單介紹4個共享池元件:
   - 庫快取(library cache)
   - 資料字典快取(dictionary cache)
   - PL/SQL區
   - SQL查詢和PL/SQL函式結果快取

共享池中的所有結構是自動管理的,在共享池的總體大小範圍內,各個結構的大小針對例項的活動模式而異. 共享池本身大小可動態重調.

庫快取:是記憶體區域,按其已分析的格式儲存最近執行的程式碼,通過將程式碼快取在共享池,可以在不重新分析的情況下重用,極大地提高效能.

資料字典快取:有時叫"行快取",它儲存最近使用的物件定義:表,索引,使用者和其它後設資料定義的描述.通過將此類定義放在SGA的記憶體中,以便使所有會話可以直接訪問它們,而不用從磁碟上的資料字典中重複讀取,提高效能.

PL/SQL區:儲存的PL/SQL物件是過程,函式,打包的過程,打包的函式,物件型別定義和觸發器.它們全都像原始碼那樣儲存在資料字典中.當會話呼叫儲存的PL/SQL物件時,它必須從資料字典讀取.為了避免重複讀取,將物件快取到共享池的PL/SQL區.

SQL查詢和PL/SQL函式結果快取:結果快取是11g新功能,在很多應用程式中,同一個查詢將由同一個會話或多個不同會話執行多次.通過建立結果快取,oracle可將此類查詢的結果儲存在記憶體中,在下次發出查詢時,伺服器可以檢索快取的結果,而不用執行該查詢.

共享池大小設定對效能影響很大,足夠大,也不能過大.共享池中的記憶體按照LRU(最近最少使用)演算法來分配. 在例項啟動時分配,大小是動態的,可進行自動管理.


大池:可選區域,如果建立大池,那些在不建立大池時使用共享池記憶體的不同程式將自動使用大池.大池的一個主要用途是供共享的伺服器程式使用. 設定大池的大小與效能無關,某個程式需要大記憶體池,而記憶體不夠用,則此程式將失敗並報錯,大池的大小可動態調整,而且可以自動管理.

Java池:應用程式需要在資料庫中執行Java儲存過程時才需要Java池.注意!Java程式碼不在Java池中快取,而在共享池中快取.Java池大小是動態的,可自動管理.

流池:供oracle流使用,從重做日誌提取變更向量,使用這些重新構造執行的語句,在遠端資料庫執行.大小動態的,可自動管理.




顯示SGA的當前,最大和最小容量:

select component,current_size,min_size,max_size from v$sga_dynamic_components


確定已為PGA分配了多少記憶體:

select name,value from v$pgastat

where name in ('maximum PGA allocated','total PGA allocated')


















來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25025926/viewspace-1067523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章