我的DBA之路——對記憶體體系的整理
阿新 • • 發佈:2019-02-07
- 記憶體區儲存資訊:
- 基本記憶體結構:
- 記憶體管理方式:
- 使用者全域性區 (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):
快取區觸控計數: 資料庫使用觸控計數來測量對 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 大小可能會因為版本不同而不同
- 軟體程式碼區