1. 程式人生 > >我的DBA之路——對記憶體體系的整理

我的DBA之路——對記憶體體系的整理

  • 記憶體區儲存資訊:
1、程式程式碼 2、有關每個已連線會話的資訊,無論其當前是否處於活動狀態 3、在程式執行期間所需的資訊,例如,正在索取資料的查詢的當前狀態 4、在多個程序之間被共享和傳遞的資訊,如鎖資訊 5、快取資料,如資料塊和重做記錄等,它們也存在於磁碟上
  • 基本記憶體結構:
1、系統全域性區(SGA) SGA 是一組稱為SGA 元件的共享記憶體結構,其中包含一個 Oracle 資料庫例項的資料和控制資訊。SGA由所有伺服器程序和後臺程序共享。例如,SGA中儲存的資料包括資料塊快取和共享 SQL區 2、程式全域性區(PGA) PGA 是一個非共享的記憶體區域,其中包含專門供某個Oracle 程序使用的資料和控制資訊。Oracle 程序啟動時, Oracle 資料庫會為其建立 PGA 每個伺服器程序和後臺程序都存在一個PGA。所有單個PGA的集合即是總例項 PGA,或例項 PGA。資料庫初始化引數設定例項 PGA的大小,而不是單個PGA的大小 3、使用者全域性區(UGA)
UGA 是與某個使用者會話相關聯的記憶體區 4、軟體程式碼區 軟體程式碼區是用來儲存正在執行或可能要執行的程式碼的那部分記憶體。Oracle 資料庫程式碼通常儲存在與使用者程式不同的位置, ——一個更專門或更受保護的位置
  • 記憶體管理方式:
1、自動記憶體管理 您指定例項記憶體的目標大小。資料庫例項自動優化到這個目標記憶體大小,根據需要在SGA 和 PGA 例項之間重新分配記憶體 2、自動共享記憶體管理 這種管理模式是部分自動化的。您設定一個SGA 的目標大小,然後設定 PGA 總目標大小,或單獨管理 PGA 的各個工作區 3、手動記憶體管理 你不必設定總的記憶體大小,但您需要設定許多初始化引數,以單獨管理SGA 和PGA例項中的各個元件
  • 使用者全域性區 (UGA):

該 UGA 必須在資料庫會話的整個存活期間是可用的。由於這個原因,當使用共享伺服器的連線時,UGA 不能儲存在 PGA中,因為 PGA 是特定於單個程序的。因此,當使用共享伺服器的連線時, UGA 被儲存在 SGA中,以使任何共享伺服器程序都能訪問它。在使用專用伺服器的連線時,UGA 儲存在 PGA 中
  • 程式全域性區(PGA):


1、私有SQL區 私有SQL 區儲存了有關某個已解析的 SQL 語句的資訊,和其他特定於會話的資訊。當伺服器程序執行 SQL 或PL/SQL 程式碼時,該過程使用其私有SQL 區域,來儲存繫結變數值、 查詢執行狀態資訊、和查詢執行工作區 遊標是指向某個特定的私有SQL 區的一個名稱或控制代碼。 你可以將遊標看成是一個從客戶端指向伺服器端狀態資訊的指標)。遊標與私有SQL區密切相關,這兩個術語有時可以互換使用

私有SQL區域: a、執行時區域 此區域包含查詢執行狀態資訊。例如,執行時區域會跟蹤到目前為止在全表掃描中檢索到的行數 Oracle 資料庫將建立執行時區域,作為一個執行請求的第一步。對於 DML 語句,其執行時區域將在SQL 語句關閉時被釋放 b、持久區域 此區域包含繫結變數的值。繫結變數是執行SQL語句時,在執行時提供給SQL語句的值。僅當關閉該遊標時,持久區域才被釋放 2、SQL工作區 工作區是在PGA中為記憶體密集型操作分配的私有記憶體區。例如,排序操作使用排序區來對一組行進行排序。同樣,雜湊聯接操作將其左側資料為輸入,並使用雜湊區來建立一個雜湊表,而點陣圖合併操作則使用點陣圖合併區來合併從掃描多個位圖索引檢索到的資料 3、在專有和共享伺服器中使用的PGA PGA 記憶體分配取決於資料庫是使用專用的還是共享的伺服器連線。表 14-1 顯示了差異之處
  • 系統全域性區(SGA):
SGA 是一個可讀寫的記憶體區,與 Oracle 後臺程序一起組成資料庫例項。所有以使用者名稱義執行的伺服器程序,都可以讀取 SGA 例項中的資訊。在資料庫操作過程中,有幾個程序會對SGA進行寫入操作 1、資料快取區快取記憶體(Database Buffer Cache) 資料庫緩衝區快取記憶體,也稱為緩衝區快取記憶體,是用於儲存從資料檔案讀取的資料塊副本的記憶體區域。緩衝區是緩衝區管理器用來暫時快取當前或最近使用的資料塊的主記憶體地址。所有同時都連線到一個數據庫例項的使用者,以共享方式訪問緩衝區快取記憶體 緩衝區快取記憶體的目的: a、優化物理I/O 資料庫更新快取中的資料塊,並將有關更改的元資料儲存在重做日誌緩衝區。提交之後,資料庫將重做緩衝區寫入磁碟,但不一定會立即將資料塊寫入磁碟。相反,資料庫寫入器 (DBWn) 在後臺執行惰性寫入操作 b、將頻繁訪問的塊保持在緩衝區快取記憶體中,而將不常存取的塊寫到磁碟 當啟用了資料庫智慧快閃記憶體快取記憶體 (flash 快取記憶體)時, 緩衝區快取記憶體的一部分可能駐留在快閃記憶體快取中。此緩衝區快取記憶體擴充套件儲存在快閃記憶體磁碟裝置上,這是一種使用快閃記憶體的固態儲存裝置。通過將緩衝區快取到快閃記憶體中,而不是從磁碟讀取,資料庫可以提高效能 注意:資料庫智慧快閃記憶體快取記憶體僅在 Solaris 和 Oracle 企業 Linux 中可用 緩衝區狀態: a、未使用的 緩衝區可供使用,因為它從未使用過,或者當前未使用。這種型別的緩衝區是資料庫最容易使用的 b、乾淨的 此緩衝區在之前曾被使用過,而現在包含某個資料塊在某個時間點的讀取一致版本。塊包含資料但是乾淨的,因此它不需要將執行檢查點操作。資料庫可以訂住該塊並重用它 c、髒的 緩衝區包含已修改、但尚未寫入到磁碟的資料。資料庫在重用該資料塊之前必須對其執行檢查點操作 每個緩衝區具有兩種訪問模式之一: 訂住的或空閒的 (未訂住)。緩衝區被"訂住"在快取中,以便當其被某個使用者會話訪問時,它不會因為記憶體不足被換出記憶體。多個會話不能在同一時間修改某個已被訂住的緩衝區 資料庫使用複雜的演算法以使緩衝區訪問高效。最近最少使用 (LRU) 列表有一個熱端和冷端,同時存在指向同一LRU上的髒緩衝區和非髒緩衝區的指標。冷緩衝區是最近未被使用的。熱緩衝區是被頻繁訪問並在最近已使用的 注意:從概念上講,只有一個 LRU, 但為了併發,資料庫實際上使用多個LRU 快取區模式: a、當前模式 當前模式獲取,也稱為資料庫塊獲取,這是一種對當前已出現在緩衝區快取記憶體中的塊的檢索。例如,如果一個未提交事務已更新某個塊中的兩行,則當前模式獲取會檢索這個具有未提交行的塊。資料庫最常使用資料庫塊獲取的情況是在修改語句期間,它只需更新塊的當前版本 b、一致模式 一致讀取獲取是對某個塊的一致讀取版本的檢索。此檢索可能會使用撤消資料。例如,如果一個未提交事務已更新某個塊中的兩行,而在另一個獨立會話中的查詢請求該塊,則資料庫使用撤消資料來建立該塊的一個讀取一致版本(稱為一致讀取克隆),它不包括未提交的更新。通常,查詢以一致模式檢索塊 緩衝區I/O: 邏輯I/O,也稱為緩衝區 I/O,指的是讀取和寫入緩衝區快取記憶體中的緩衝區。當在記憶體中找不到請求的緩衝區時,資料庫將執行一個物理 I/O,將緩衝區從快閃記憶體快取或磁碟複製到記憶體,然後再執行一個邏輯 I/O,以讀取快取的緩衝區 1)、快取區寫出: a、伺服器程序找不到乾淨的緩衝區,以將新塊讀入資料庫緩衝區快取記憶體 b、資料庫必須推進檢查點,即重做執行緒中進行例項恢復的起點 c、表空間被更改為只讀狀態,或離線 2)、快取區讀取: a、禁用了快閃記憶體快取記憶體 資料庫中根據需要覆蓋並重新利用每個乾淨的緩衝區。如果以後需要重用被覆蓋的緩衝區,則資料庫必須從磁碟重新讀取 b、啟用了快閃記憶體快取記憶體 DBWn 將乾淨緩衝區的正文寫入到快閃記憶體快取,使其記憶體中的緩衝區可以被重用。資料庫在主記憶體中保留 LRU 列表的緩衝區頭,以跟蹤在快閃記憶體快取中的緩衝區體的狀態和位置。如果以後需要該緩衝區,則資料庫可以從快閃記憶體快取中讀取它,而不用從磁碟讀取 伺服器在緩衝區快取記憶體中的搜尋順序: a、伺服器程序在緩衝區快取記憶體中搜索整個緩衝區 如果該程序發現整個緩衝區,則資料庫對此緩衝區執行一個邏輯讀取 b、伺服器程序在快閃記憶體快取LRU 列表中搜索緩衝區頭 如果該程序找到了緩衝區頭,則資料庫執行一個優化的物理讀取,將緩衝區正文從快閃記憶體快取讀入到記憶體內快取 c、如果該程序沒有在記憶體中找到該緩衝區(快取未命中),則伺服器程序將執行以下步驟: 1)、將該塊從資料檔案複製到記憶體中 (物理讀取) 2)、對已讀入到記憶體中的緩衝區執行一個邏輯讀取
快取區觸控計數: 資料庫使用觸控計數來測量對 LRU 列表上的緩衝區進行訪問的頻率。這種機制使得當某個緩衝區被訂住時資料庫可以增加一次計數,而不用不斷地移動LRU 列表上的緩衝區 緩衝區和全表掃描: 當緩衝區必須從磁碟讀入時, 資料庫會將緩衝區插入到 LRU 列表的中部。通過這種方式,熱塊可以保留在快取中,以使他們不需要再次從磁碟讀取 全表掃描順序讀取表高水位下的所有行,這可能引發一個問題。假設表段中塊的總大小大於緩衝區快取記憶體的大小。在此表上的全表掃描可能會清除快取記憶體,致使資料庫不能將頻繁訪問的塊維持在快取記憶體中 大型表的完全掃描導致將塊讀入資料庫快取記憶體,與其他型別讀取的處理方式有所不同。(在完成掃描之後,這些緩衝區中的)塊可以被立即重用,以防止該掃描真正地清理緩衝區快取記憶體 在某些少有的情況下,若預設行為不是你所希望的,您可以更改表的CACHE屬性。在這種情況下,資料庫不會在快取中強制或訂住塊,而是與任何其他塊相同的方式,讓其從快取記憶體中老化移出。使用此選項時要小心,因為大表的全表掃描可能會將大部分的其他塊從快取中清理出去 緩衝區池: 緩衝池是緩衝區的集合。資料庫緩衝區快取記憶體被劃分為一個或多個的緩衝池 a、預設池 該池是塊通常被快取的地方。除非您手動配置單獨的池,預設池將是唯一的緩衝池 b、保留池 該池用於被頻繁訪問的塊,使其不會由於預設池的空間不足而被移出。保留緩衝池的目標是將物件保留在記憶體中,從而避免 I/O 操作 c、迴圈池 該池用於不被頻繁使用的塊。迴圈池防止物件在快取中佔用不必要的空間
2、重做日誌緩衝區(Redo Log Buffer) 重做日誌緩衝區是SGA中的一個迴圈式緩衝區,用來儲存對資料庫所做更改的重做條目。重做條目包含用於重建(或重做)由 DML 或 DDL 操作對資料庫所做更改所需的資訊。資料庫恢復將重做條目應用到資料檔案,以重建丟失的更改
LOG_BUFFER 初始化引數指定了 Oracle 資料庫在緩衝重做條目時所能使用的記憶體量。與其他的 SGA 元件不同,重做日誌緩衝區和固定的 SGA 緩衝區不按顆粒劃分記憶體 3、共享池(Shared Pool) 共享池快取各種型別的程式資料。例如,共享池儲存已解析的 SQL、 PL/SQL 程式碼、 系統引數、和資料字典資訊。幾乎資料庫中發生的每個操作都涉及到共享池。例如,如果使用者執行一個SQL 語句,則Oracle 資料庫會訪問共享池
庫快取 庫快取是儲存可執行 SQL 和 PL/SQL 程式碼的共享池記憶體結構。此快取包含共享SQL 和 PL/SQL區,以及鎖和庫快取控制代碼之類的控制結構。在共享伺服器體系結構中,庫快取還包含私有SQL區 在執行 SQL 語句時,資料庫將嘗試重用以前執行過的程式碼。如果在庫快取中存在該SQL 語句的已解析表示形式,並且是可以共享的,則資料庫會重用該程式碼,這稱為軟解析或庫快取命中。否則,資料庫必須為應用程式程式碼建立一個新的可執行版本,這稱為硬解析或庫快取未命中 1)、共享SQL區: a、共享SQL區 資料庫使用共享SQL 區來處理 SQL 語句第一次發生時的情況。該區域對所有使用者可訪問,幷包含語句的解析樹和執行計劃。對於每個唯一的語句,只存在一個共享SQL區 b、私有SQL區 每個發出 SQL 語句的會話在其 PGA中有一個私有SQL 區。提交同一語句中的每個使用者都分別有一個私有SQL 區,但都指向同一共享 SQL 區。因此,在多個單獨PGA中的私有 SQL區可能與同一共享SQL 區相關聯 執行步驟: 1)、檢查共享池,看是否存在某個語法和語義上都相同的語句的共享 SQL 區 a、如果存在這樣一個相同的語句,則資料庫為該語句的後續新例項使用這個共享SQL 區,從而減少記憶體消 b、如果不存在這樣一個相同的語句,則資料庫在共享池中分配一個新的共享SQL 區。語法相同、但語義不同的語句會使用一個子遊標 2)、為該會話分配一個私有SQL 區 私有SQL 區的位置取決於該會話所建立的連線。如果會話是通過共享伺服器連線的,則該私有SQL 區中的一部分被儲存在 SGA中
程式單元和庫快取: 庫快取包含PL/SQL 程式和 Java 類的可執行形式。這些專案統稱為程式單元 共享池中的記憶體分配和重用: 當解析新的 SQL 語句時,資料庫將分配共享池記憶體。記憶體大小取決於語句的複雜性 通常,共享池中的專案會一直保留,直到按LRU 演算法將其移除。資料庫允許共享池中用於多個會話的專案被保留在記憶體中,只要他們還有用,即使建立該專案的程序已經終止。這一機制能最小化開銷和對SQL 語句的處理 如果需要為新專案騰出空間,則資料庫會釋放記憶體中不常使用的專案。某個共享的 SQL 區可能會被從共享池中刪除,即使該共享SQL 區對應於一個已開啟但已有一段時間未使用的遊標。如果隨後又需要執行這個已開啟的遊標,則 Oracle 資料庫重新解析該語句並分配新的共享 SQL 區 1)、從共享池中刪除共享SQL區 a、如果為表、 表簇、或索引收集了統計資訊,則預設情況下,資料庫在一段時間後,會逐步刪除所有包含引用了已分析物件的語句的共享SQL 區。下次執行某個已刪除的語句時,資料庫將在一個新的共享 SQL 區中對其進行解析,以反映模式物件的新的統計資訊 b、如果一個模式物件在某個 SQL 語句中被引用,而之後此物件被某個DDL 語句修改,則資料庫將使這個共享 SQL 區無效。當下一次執行該語句時,優化程式必須重新解析該語句 c、如果更改了全域性資料庫名稱,則資料庫將刪除所有共享池資訊 你可以使用ALTER SYSTEM FLUSH SHARED_POOL語句,手動刪除共享池中的所有資訊,以評估例項重新啟動後預期的效能 資料字典快取: 資料字典是資料庫表和檢視的集合,其中包含有關資料庫及其結構、使用者等參考資訊。Oracle 資料庫在解析SQL 語句期間,會頻繁訪問資料字典 資料字典的記憶體位置: a、資料字典快取 此快取儲存有關資料庫物件的資訊。此快取也稱為行快取,因為它按行、而不是按緩衝區儲存資料 b、庫快取 所有伺服器程序都共享這些快取來對資料字典資訊進行訪問 伺服器結果快取: 與緩衝池儲存資料塊不同,伺服器結果快取儲存的是結果集。伺服器結果快取包含SQL 查詢結果快取和 PL/SQL 函式結果快取,它們共享相同的基礎結構 客戶端結果快取不同於伺服器結果快取。客戶端快取在應用程式級別配置,並位於客戶端記憶體中,而不是位於資料庫記憶體中 a、SQL查詢結果快取 資料庫能在SQL 查詢結果快取記憶體中儲存查詢和查詢片段的結果,將此快取結果用於將來的查詢和查詢片段。大多數應用程式受益於這種效能改善 b、PL/SQL 函式結果快取 PL/SQL 函式結果快取儲存函式的結果集。若不使用快取功能,每次呼叫花1秒鐘的函式,呼叫該函式1000次將花時間1000 秒。而快取後,以相同的輸入呼叫函式1000次總共僅需要時間1 秒。對於在相對靜態的資料上被頻繁呼叫的函式,結果快取是一個很好的選擇 保留池: 保留池是共享池中的一個記憶體區, Oracle 資料庫使用它來分配大的連續記憶體塊 從共享池中分配記憶體是按大塊執行的。大塊使得大型物件(超過 5 KB)可以被載入到快取中,而不需要一個單一的連續區域。這樣一來,資料庫中由於碎片引起的連續記憶體不足的可能性降低了 有時,Java、 PL/SQL、或 SQL 遊標也可能會從共享池中分配大於 5 KB 的記憶體塊。為使這種分配更有效,資料庫從共享池中為保留池隔離出少量記憶體 4、大池(Large Pool) 大池是一個可選的記憶體區域,它所提供的記憶體分配往往比共享池分配的記憶體更大 可提供大記憶體分配: a、共享伺服器的UGA,和 Oracle XA介面 (用於與多個數據庫進行互動的事務) b、並行執行語句中使用的訊息緩衝區 c、恢復管理器 (RMAN) I/O 從屬程序的緩衝區 通過從大池中為共享SQL分配會話記憶體,資料庫可以避免由收縮共享 SQL 快取引起的效能開銷。通過為 RMAN 操作、I/O 伺服器程序、和並行緩衝區等分配大的緩衝區記憶體,大池可以比共享池更好地滿足大型記憶體請求
共享池中的保留空間與其它記憶體分配都使用同一LRU列表,而大池與此不同,它根本就沒有LRU 列表。這些被分配的記憶體片斷直到操作完成後才會被釋放。一旦釋放了一個大塊記憶體,其他程序就可以使用它 5、Java池(Java ool) Java 池是一個儲存Java 虛擬機器 (JVM) 內所有會話特定的 Java 程式碼和資料的記憶體區。此記憶體包括在呼叫端遷移到 Java 會話空間的Java 物件 對於專用伺服器連線,Java 池包括每個 Java 類的共享部分,包括方法和只讀記憶體,如程式碼向量,但不包括每個會話的Java 狀態。對於共享伺服器,Java池包括每個 Java 類的共享部分,和用於每個會話狀態的一些 UGA 。每個 UGA 根據需要增長和縮小,但總的 UGA 大小必須適應 Java 池空間 6、流池(Streams Pool) 流池用於儲存緩衝的佇列訊息,併為 Oracle 流的捕獲程序和應用程序提供記憶體。流池專門由Oracle 流使用 如果您沒有專門配置流池,則其大小從零開始。流池的大小由Oracle 流按需動態增長 7、固定SGA(Fixed SGA) 固定SGA 是內部的內務管理區域 固定SGA 包含: a、有關資料庫及其例項狀態的一般資訊,後臺程序需要訪問這些資訊 b、程序間通訊的資訊,如有關鎖的資訊 固定 SGA 的大小由 Oracle 資料庫設定,且不能手動更改。固定SGA 大小可能會因為版本不同而不同
  • 軟體程式碼區
軟體程式碼區是用於儲存正在執行或可以執行的程式碼的那部分記憶體。Oracle資料庫程式碼的儲存位置通常比使用者程式更專用、更受保護