記憶體_SGA

lusklusklusk發表於2016-05-24

SGA_MAX_SIZE specifies the maximum size of the SGA for the lifetime of the instance.

SGA_TARGETspecifies the total size of all SGA components. If SGA_TARGET is specified,then Buffer cache\Shared pool\Large pool\Java pool\Streams pool are automatically sized:

 

sga_max_size的值必須大於sga_target,否則會報錯ORA-00823: Specified value of sga_target greater than sga_max_size

 

SGA_TARGET不等於0,則是ASMM

 

SGA_MAX_SIZE不能動態修改,修改後必須重啟

 

 

SGA主要由資料高速緩衝區(Database Buffer Cache)、共享池(Shared Pool)、重做日誌緩衝區(Redo Log Buffer)、大型池(Large Pool)、Java池(Java Pool)、流池(Streams Pool)組成

 

資料高速緩衝區(Database Buffer Cache)儲存的最近從資料檔案中檢索出來的資料。包括髒快取塊,空閒快取塊,命中快取塊三種型別。

 

共享池(Shared Pool)用於快取最近執行過的SQL語句、PL/SQL程式和資料字典資訊,是對SQL語句、PL/SQL程式進行語法分析、編譯、執行的區域,其的主要元件有library cachedictionary cachelibrary cache 儲存了最近的SQL/PLSQL程式碼的可執行模式(解析或編譯版本)。

 

大型池(Large Pool)它可以提供一個大的區以供象資料庫的backuprestore操作,如果沒有在SGA中建立大型池,那麼上述操作所需要的快取空間將在共享池或PGA中分配,因而會影響共享池或PGA的使用效率

 

Stream pool流池(或者如果沒有配置流池,則是中至多10%的空間)會用於程式在資料庫間移動/複製資料時使用的訊息, 流池只對使用了流資料庫特性的系統是重要的。在這些環境中,必須設定流池,以避免因為這個特性從竊取”10%的空間。

 

DataPump工具Expdp/Impdp需要從PGASGAShared PoolStreams PoolLarge Pool分配必要的記憶體。為了避免Expdp/Impdp出現ORA-04031/ORA-04030錯誤,我們有必要在自動管理模式下設定合理的 pga_aggregate_targetsga_target(抑或者memory_target)記憶體初始化引數,如果使用手動的SGA管理的話, 那麼有必要保證shared_pool_size的設定適宜,對於Streams PoolLarge Pool一般設定為150MB大小。

 

Expdp/Impdpshared Pool的開銷主要體現在其執行過程中需要呼叫一系列的包體PACKGE BODY

 

 

 

 

Shared Pool

Oracle佔用量最大的兩塊記憶體除了buffer cache區就是Shared Pool的記憶體了,它的結構非常的複雜,而且由於要快取SQL程式碼這種非標準大小的文字,經常會產生大量的碎片化記憶體,shared pool總體上包含了兩大部分,一塊是library cache區,用來快取SQLPL/SQL程式碼,儲存它們的執行計劃,提高SQL的解析效率,如果你的應用程式碼從來不使用繫結變數,那麼這一塊的記憶體對你來說是一個很大的負擔,但是Oracle裡是無法關閉library cache區的,因此對於OLTP系統,請確保SQL都使用了繫結變數。第二大塊區域是row cache區,用來快取資料庫的資料字典,由於儲存在裡面的資訊是以行的形式存在,因此叫row cache。對於這一塊的記憶體,依據資料庫中元資訊(metadata)的多少而決定,如果資料庫中有幾十萬的物件,那麼這一塊的記憶體就會佔用比較大,同時表上的很多列都有直方圖資訊,也會導致這一區的記憶體佔用比較大。在一個穩定的系統中,這一區域的記憶體基本上是靜態的,Oracle中幾乎沒有操作會頻繁修改row cache區。有個例外情況是沒有cache屬性的sequence,如果這種sequence呼叫頻繁,就會觸發頻繁的修改sequence的屬性值,進而可能會產生row cache lock的一些等待,最佳化的辦法是為每一個sequence設定足夠的cache值。 如果應用程式沒有使用繫結變數,而且難以修改,可以透過設定cursor_sharingforce來嘗試解決問題。

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

相關文章