Oracle的記憶體管理

來源:互聯網
上載者:User

oracle資料庫執行個體啟動時,需要分配共用記憶體,啟動後台進程。

oracle資料庫使用的記憶體主要涉及到:PGA和SGA。

一、 PGA

Program Global Area,顧名思義是程式全域區,是伺服器處理序(Server Process)使用的一塊包含資料和控制資訊的記憶體地區,PGA是非共用的記憶體,在伺服器處理序啟動或建立時分配,並為Server Process排他訪問。

進程的建立有兩方式:專用伺服器模式(Dedicated Server)和共用伺服器模式(Shared
Server)。專用伺服器模式下,Oracle為每個會話啟動一個Oracle進程;在共用伺服器模式下,通常在伺服器端啟動一定數量的伺服器處理序,然
後由多個用戶端請求共用同一個Oracle服務進程。通常伺服器運行在專用伺服器模式下。

  
 PGA的建立過程

   oracle的結構圖

 PGA建立過程:當用戶端向伺服器發送串連請求,伺服器監聽到用戶端要求,在專用伺服器模式下,在伺服器端產生一個Serlver
Process來代理使用者的請求,伺服器處理序進而向執行個體發起串連,建立會話(Create Session),而PGA就為為Servler
Process所分配和使用。

 

通常,PGA包括私人SQL區、Session資訊等內容。

會話記憶體(Session Memory):用於存放會話的登入資訊以及其他相關資訊,對於共用伺服器模式,這部分是共用的。

私人SQL區(Private SQL Area):包含綁定變數資訊,查詢執行狀態資訊以及查詢工作區等。每個發出查詢的會話都有一塊私人SQL區,對於專用伺服器模式,這部分記憶體在PGA中分配,對於共用伺服器模式,這部分記憶體在SGA中分配。

私人SQL區又由兩部分組成: 永久地區(Persistent
Area):包含綁定變數等資訊,這部分記憶體只有在遊標關閉時才會被釋放;運行時地區(Runtime
Area),存放了SQL語句運行時所需要的資訊,在執行請求時首先建立,其中包含了查詢執行的狀態資訊、SQL Work Areas。

 

二、 UGA(User Global
Area):使用者全域區。由使用者會話資料、遊標狀態和索引區組成。在共用伺服器模式下,一個共用服務進程被多個使用者進程共用,此時UGA是Shared
Pool或Large Pool的一部分,而在專用伺服器下,UGA則是PGA的一部分。

在Dedicatred模式下,PGA與UGA的關係,就如同Process和Session的關係,PGA是服務於進程的記憶體結構,包含進程資訊;而UGA是服務於會話的,包含的是會話的資訊。

固定UGA包括大約70個原子變數,小的資料結構以及指向UGA堆的指標。

還有一塊記憶體地區是CGA(Call Glabal Area,調用全域區),存在是瞬間的,只存在於調用過程中,而且不論UGA存在於PGA還是SGA,CGA都是PGA的SubHeap.SQL解析、SQL最佳化需要用到CGA。這裡不展開介紹。

三、 SGA(System Global Area):系統全域區,用於載入資料、對象並儲存運行狀態和資料庫控制資訊的一塊記憶體地區,在資料庫執行個體啟動時分配,當執行個體關閉時釋放,每個執行個體都有自己的SGA區。

 SGA的體繫結構圖上面的圖已包括。

串連到Oracle資料庫的使用者都可以共用SGA中的資料,通常是為了更最佳化的效能,SGA設定得更高,可以減少物理I/O(SGA中資料緩衝區的增大可以有效地減少物理讀取)。

組成:

1. 固定地區(Fixed Area): Fixed Area是SGA中的固定部分,包含幾千個變數和一些小的資料結構,如Latch或地址指標等,這部分記憶體配置和特定的資料庫版本以及平台有關,不受使用者控制,固定部分只需要很小的記憶體。

2. Buffer
Cache(緩衝區快取):用於儲存最近使用的資料區塊,這些資料區塊可能修改過,也可以未修改過。在Oracle對資料的處理中,代價最昂貴的就是物理
I/O(Physical
I/O),同樣的資料從記憶體中得到比從磁碟上讀取快得多,所以將儘可能多的資料儲存在記憶體中,可以減少磁碟I/O操作,從而提高資料庫效能。

通常的資料訪問和修改都需要通過Buffer Cache來完成。當一個進程需要訪問資料時,首先需要確定資料是否在記憶體中存在
,如果資料在Buffer中存在,則需要根據資料的狀態來判斷是否可以直接存取還是需要構造一致性讀取;如果資料在Buffer中不存在,則需要在
Buffer Cache中尋找足夠的空間以裝載需要的資料,如果Buffer
Cache中找不到足夠的記憶體空間,則需要觸發DBWR去寫出髒資料,釋放Buffer空間。

Buffer Cache使用了Hash Bucket和Cache Buffer Chain存放資料。

每個Buffer中存放的Bucket由Buffer的資料區塊地址(Data Block
Address)運算決定。在Bucket內部,通過Cache Buffer Chain(雙向鏈表)將所有的Buffer通過Buffer
Header資訊聯絡起來。Buffer
Header存放的是對應資料區塊的概要資訊,包括資料區塊的檔案號、塊地址、狀態等。判斷資料區塊是否在Buffer中存在,通過檢查Buffer
header即可確定。

 

3. Shared Pool(共用池),包含共用記憶體結構,如SQL區等。SQL區包含SQL解析樹、執行計畫等資訊,通過共用池,反覆執行的SQL可以在不同Session間得到共用。

Shared Pool是Oracle SGA中設定最複雜也是最重要的一環,Shared Pool可實現SQL共用、減少代碼硬解析等,提高資料庫的效能。

Oracle引入Shared Pool是為了協助我們實現代碼的共用和重用。

組成:

庫緩衝(Library Cache):主要儲存SQL語句、SQL語句解析樹、執行計畫、PL/SQL程式塊以及它們轉換後能夠被Oracle執行的代碼等;

資料字典緩衝(Data Dictionary Cache): 主要存放資料字典資訊,包括表、視圖等對象的結構資訊,使用者以及對象許可權等資訊,這部分資訊相對穩定。


 shared pool與buffer cache的協同工作

除上述兩部分,從Oracel 11g開始,在Shared Pool中划出了另外一塊記憶體用於儲存SQL查詢的結果集,稱為Result
Cache Memory(結果集緩衝)。以前的Shared
Pool的主要功能是共用SQL,減少硬解析,從而提高效能,但SQL共用以後,執行查詢同樣可以消耗大量的時間和資源,現在Oracle嘗試將查詢的結
果集緩衝,可以將緩衝的查詢結果返回給使用者,不需要真正去執行運算,為效能帶來了極大的提升。

4. Redo Log Buffer-日誌緩衝區儲存重做日誌條目,記錄資料庫變更,最終將被寫出到重做記錄檔中,在資料庫崩潰或故障時用於恢複。

5. Java Pool:用於JVM等Java選件。

記憶體配置Oracle的建議是:Oracle最多可以使用80%的實體記憶體,其餘20%記憶體給作業系統使用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.