標籤:oracle 資料存放區 記憶體結構
Oracle 記憶體結構
與 Oracle 執行個體關聯的基本記憶體結構包括:
系統全域區 (SGA):由所有伺服器和後台進程共用。SGA 中儲存的資料樣本包括快取的資料區塊和共用 SQL 地區。
程式全域區 (PGA):各個伺服器處理序和後台進程專用,每個進程都有一個 PGA。
SGA 是共用記憶體區,包含執行個體的資料和控制資訊,由以下各項組成:
資料庫緩衝區快取:用於緩衝從磁碟檢索到的資料區塊
重做日誌緩衝區:用於緩衝重做資訊,直到其可以寫入磁碟為止
共用池:用於緩衝可在使用者間共用的各種結構
大型池:用於緩衝大型 I/O 請求的可選地區,以便支援並行查詢、共用伺服器、Oracle XA 以及某些類型的備份操作
Java 池:用於存放 JAVA 虛擬機器 (JVM) 中特定於會話的 Java 代碼和資料
流池:由 Oracle Streams 使用
保留緩衝區快取:用於存放會儘可能長地保留在緩衝區快取中的資料
迴圈緩衝區快取:用於存放緩衝區快取中很快到期的資料
nK 塊大小緩衝區快取:用於緩衝大小與預設資料庫塊大小不同的資料區塊,用來支援可傳輸的資料表空間
資料庫緩衝區快取、共用池、大型池、流池和 Java 池的大小可以按照當前需求自動調整。而且,這些記憶體緩衝區以及保留緩衝區快取、迴圈緩衝區快取和 nK 塊大小緩衝區快取可以在不關閉執行個體的情況下變更。
Oracle 資料庫會提供預警和指導,以標識記憶體大小問題,從而協助確定相應的記憶體參數值。
程式全域區 (PGA) 是一個記憶體區,其中包含每個伺服器處理序的資料及控制資訊。伺服器處理序是處理客戶機請求的進程。每個伺服器處理序都有在伺服器處理序啟動時建立的自己專用的 PGA。只有該伺服器處理序才能訪問。
所用 PGA 記憶體量和 PGA 的內容取決於執行個體是否是在共用伺服器模式下配置的。通常,PGA 包含下列內容:
專用 SQL 區:包含綁定資訊和運行時記憶體結構等資料。發出 SQL 陳述式的每個會話都有一個專用 SQL 區。
會話記憶體:此處分配的記憶體用於存放會話變數以及與該會話相關的其它資訊。
1.緩衝區快取 data buffer cache
通過指定 DB_CACHE_SIZE 參數的值,可以配置緩衝區快取。緩衝區快取可存放資料檔案中塊大小為 DB_BLOCK_SIZE 的資料區塊的副本。緩衝區快取是 SGA 的一部分;因此所有使用者都可以共用這些塊。伺服器處理序將資料檔案中的資料讀入緩衝區快取。為了提高效能,伺服器處理序有時在一個讀操作中會讀取多個塊。然後由 DBWn 進程將資料從緩衝區快取寫入資料檔案。為提高效能,DBWn 在一個寫操作中會寫入多個塊。
在任何給定時間,緩衝區快取都可能會存放一個資料庫塊的多個副本。雖然該塊只存在一個當前副本,但為了滿足查詢需要,伺服器處理序可能需要根據過去的映像資訊構造讀一致性副本。這稱為讀一致性 (CR) 塊。
最近最少使用 (LRU) 列表可反映緩衝區的使用方式。緩衝區將依據其被引用時間的遠近和引用頻率進行排序。因此,最經常使用且最近使用過的緩衝區將列在最近最常使用一端。傳入的塊先被複製到最近最少使用一端的緩衝區中,然後該緩衝區將被指定到列表中央,作為起點。從這個起點開始,緩衝區根據使用方式在列表中上下移動。
緩衝區快取中的緩衝區可以處於以下四種狀態之一:
已串連:當前正將該塊讀入快取或正在寫入該塊。其它會話正等待訪問該塊。
乾淨的:該緩衝區目前未串連,如果其當前內容(資料區塊)將不再被引用,則可以立即執行到期處理。這些內容與磁碟保持同步,或者緩衝區包含塊的讀一致性快照。
空閑/未使用:緩衝區因執行個體剛啟動而處於空白狀態。此狀態與“乾淨的”狀態非常相似,不同之處在於緩衝區未曾使用過。
灰:緩衝區不再處於串連狀態,但內容(資料區塊)已更改,因此必須先通過 DBWn 將內容重新整理到磁碟,然後才能執行到期處理。
伺服器處理序使用緩衝區快取中的緩衝區;而 DBWn 進程通過將更改的緩衝區寫回資料檔案,使快取中的緩衝區變為可用狀態。檢查點隊列中列出將要寫出到磁碟的緩衝區。
Oracle 資料庫支援同一資料庫中有多種塊大小。標準塊大小用於 SYSTEM 資料表空間。標準塊大小可以通過設定初始化參數 DB_BLOCK_SIZE 來指定。其有效值介於 2 KB 到 32 KB 之間,預設值為 8 KB。非標準塊大小的緩衝區的快取大小通過以下參數指定:
DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
DB_nK_CACHE_SIZE 參數不能用於調整標準塊大小的快取的大小。如果 DB_BLOCK_SIZE 的值為 nK,則設定 DB_nK_CACHE_SIZE 是非法的。標準塊大小的快取的大小始終由 DB_CACHE_SIZE 的值確定。
由於每個緩衝區快取的大小都有限制,因此,通常並非磁碟上的所有資料都能放在快取中。當快取寫滿時,後續快取未命中會導致 Oracle 資料庫將快取中已有的灰資料寫入磁碟,以便為新資料騰出空間。(如果緩衝區中沒有灰資料,則不需要寫入磁碟即可將新塊讀入該緩衝區。)以後若對已寫入磁碟的任何資料進行訪問,則會導致再次出現快取未命中現象。
資料請求導致快取命中的幾率會受到快取大小的影響。快取越大,包含所請求資料的幾率也就越大。因此,增加快取大小會提高引起快取命中的資料請求的百分比。
資料庫管理員 (DBA) 可以建立多個緩衝區池來提高資料庫緩衝區快取的效能。您可以根據對象的訪問情況將其分配給某個緩衝區池。緩衝區池有三種:
保留:此池用於保留記憶體中可能要重用的對象。將這些對象保留在記憶體中可減少 I/O 操作。通過使池的大小大於分配給該池的各個段的總大小,可以將緩衝區保留在此池中。這意味著緩衝區不必執行到期處理。保留池可通過指定 DB_KEEP_CACHE_SIZE 參數的值來配置。
迴圈:此池用於記憶體中重用幾率很小的塊。迴圈池的大小要小於分配給該池的各個段的總大小。這意味著讀入該池的塊經常需要在緩衝區內執行到期處理。迴圈池可通過指定 DB_RECYCLE_CACHE_SIZE 參數的值來配置。
預設:此池始終存在。它相當於沒有保留池和迴圈池的執行個體的緩衝區快取,可通過 DB_CACHE_SIZE 參數進行配置。
註:保留池或迴圈池中的記憶體不是預設緩衝區池的子集。
CREATE INDEX cust_idx …
STORAGE (BUFFER_POOL KEEP …);
ALTER TABLE oe.customers
STORAGE (BUFFER_POOL RECYCLE);
ALTER INDEX oe.cust_lname_ix
STORAGE (BUFFER_POOL KEEP);
手工重新整理記憶體:
alter system flush buffer cache;
BUFFER_POOL 子句用於定義對象的預設緩衝區池。它是 STORAGE 子句的一部分,對 CREATE 和 ALTER 表、簇和索引語句有效。未明確設定緩衝區池的對象中的塊將進入預設緩衝區池。
文法為:BUFFER_POOL [KEEP | RECYCLE | DEFAULT]。
使用 ALTER 語句更改對象的預設緩衝區池時,已緩衝的塊會一直保留在其當前緩衝區中,直到正常緩衝區管理活動將它們清除為止。從磁碟讀取的塊將被放置在為該段新指定的緩衝區池中。
由於多個緩衝區池被分配給某一個段,所以有多個段的對象可以將塊放置在多個緩衝區池中。例如,按索引組織的表在索引段和溢出段上可以有多個不同的池。
2.共用池 shared pool
大小通過 SHARED_POOL_SIZE 指定。
庫快取包含語句文本、已進行文法分析的代碼和執行計畫。
資料字典快取包含資料字典表中各表、列和許可權的定義。
使用者全域區 (UGA) 包含會話資訊(如果使用 Oracle 共用伺服器)。
庫快取:庫快取包含共用 SQL 區和 PL/SQL 區 - 經過完全文法分析或編譯的 PL/SQL 塊和 SQL 陳述式的標記法。PL/SQL 塊包括:
過程和函數
程式包
觸發器
匿名
PL/SQL 塊
資料字典快取:資料字典快取將字典對象的定義存放在記憶體中。
結果快取:結果快取包含 SQL 查詢結果快取和 PL/SQL 函數結果快取。此快取用於儲存 SQL 查詢或 PL/SQL 函數的結果,以加快其將來的執行速度。
使用者全域區:UGA 包含 Oracle 共用伺服器的會話資訊。使用共用伺服器會話時,如果尚未配置大型池,則 UGA 位於共用池中。
3.大型池large pool
可配置為 SGA 中一個單獨的記憶體區
大小由 LARGE_POOL_SIZE 參數指定
用於在記憶體中為以下各項儲存資料:
--UGA
--備份與還原操作
--並行查詢訊息傳送
大型池必須顯式配置。大型池的記憶體不是來自共用池,而是直接來自 SGA,這就增大了 Oracle 伺服器在執行個體啟動時需要的共用記憶體量。
大型池用於為以下各項分配大量會話記憶體:
--I/O 伺服器處理序
--備份與還原操作
--Oracle 共用伺服器處理序和 Oracle XA 介面(交易處理與多個資料庫互動時使用)
由於從大型池為 Oracle 共用伺服器分配會話記憶體,因此共用池中由於頻繁分配和取消分配大對象而產生的片段也就很少。將大對象從共用池中分離出來,可增加共用池記憶體的使用效率,這意味著,它可以將更多記憶體用於處理新的請求,以及在需要時用於保留現有資料。
4.Java pool
可配置為 SGA 中一個單獨的記憶體區
大小由 JAVA_POOL_SIZE 參數指定
用於將 JVM 中特定於會話的所有 Java 代碼和資料存放區在記憶體中
5.重做日誌緩衝區 redo buffer cache
Oracle 伺服器處理序將重做條目從使用者的記憶體空間複製到每個 DML 或 DDL 語句的重做日誌緩衝區。重做條目包含重建或重做 DML 和 DDL 操作對資料庫的更改所必需的資訊。它們用於資料庫恢複,需要佔用緩衝區中的連續空間。
重做日誌緩衝區是一個迴圈緩衝區;伺服器處理序可以用新條目覆蓋重做日誌緩衝區中已寫入磁碟的條目。LGWR 進程的寫速度通常都很快,足以確保緩衝區中始終有儲存新條目的空間。LGWR 進程將重做日誌緩衝區寫入磁碟上的活動聯機重做記錄檔(或活動群組成員)中。LGWR 進程將 LGWR 上次寫入磁碟以來進入緩衝區的所有重做條目複製到磁碟。
什麼導致 LGWR 執行寫操作?
使用者進程提交交易處理時
每隔三秒,或每當重做日誌緩衝區佔滿三分之一時
DBWn 進程將修改的緩衝區寫入磁碟時(如果相應的重做日誌資料尚未寫入磁碟)
oracle 記憶體結構詳解