Oracle 記憶體結構
與 Oracle 例項關聯的基本記憶體結構包含:
系統全域性區 (SGA):由全部server和後臺程式共享。SGA 中儲存的資料演示樣例包含快速快取的資料塊和共享 SQL 區域。
程式全域性區 (PGA):各個server程式和後臺程式專用。每一個程式都有一個 PGA。
SGA 是共享記憶體區。包括例項的資料和控制資訊。由下面各項組成:
資料庫緩衝區快速快取:用於快取從磁碟檢索到的資料塊
重做日誌緩衝區:用於快取重做資訊,直到其能夠寫入磁碟為止
共享池:用於快取可在使用者間共享的各種結構
大型池:用於緩衝大型 I/O 請求的可選區域。以便支援並行查詢、共享server、Oracle XA 以及某些型別的備份操作
Java 池:用於存放 Java 虛擬機器 (JVM) 中特定於會話的 Java 程式碼和資料
流池:由 Oracle Streams 使用
保留緩衝區快速快取:用於存放會盡可能長地保留在緩衝區快速快取中的資料
迴圈緩衝區快速快取:用於存放緩衝區快速快取中非常快過期的資料
nK 塊大小緩衝區快速快取:用於快取大小與預設資料庫塊大小不同的資料塊。用來支援可傳輸的表空間
資料庫緩衝區快速快取、共享池、大型池、流池和 Java 池的大小能夠依照當前需求自己主動調整。
並且,這些記憶體緩衝區以及保留緩衝區快速快取、迴圈緩衝區快速快取和 nK 塊大小緩衝區快速快取能夠在不關閉例項的情況下進行更改。
Oracle 資料庫會提供預警和指導,以標識記憶體大小問題。從而幫助確定對應的記憶體引數值。
程式全域性區 (PGA) 是一個記憶體區。當中包括每一個server程式的資料及控制資訊。
server程式是處理客戶機請求的程式。每一個server程式都有在server程式啟動時建立的自己專用的 PGA。僅僅有該server程式才幹訪問。
所用 PGA 記憶體量和 PGA 的內容取決於例項是否是在共享server模式下配置的。通常,PGA 包括下列內容:
專用 SQL 區:包括繫結資訊和執行時記憶體結構等資料。
發出 SQL 語句的每一個會話都有一個專用 SQL 區。
會話記憶體:此處分配的記憶體用於存放會話變數以及與該會話相關的其他資訊。
1.緩衝區快速快取 data buffer cache
通過指定 DB_CACHE_SIZE 引數的值,能夠配置緩衝區快速快取。緩衝區快速快取可存放資料檔案裡塊大小為 DB_BLOCK_SIZE 的資料塊的副本。緩衝區快速快取是 SGA 的一部分;因此全部使用者都能夠共享這些塊。
server程式將資料檔案裡的資料讀入緩衝區快速快取。為了提高效能。server程式有時在一個讀操作中會讀取多個塊。然後由 DBWn 程式將資料從緩衝區快速快取寫入資料檔案。
為提高效能,DBWn 在一個寫操作中會寫入多個塊。
在不論什麼給定時間,緩衝區快速快取都可能會存放一個資料庫塊的多個副本。
儘管該塊僅僅存在一個當前副本,但為了滿足查詢須要,server程式可能須要依據過去的映像資訊構造讀一致性副本。這稱為讀一致性 (CR) 塊。
近期最少使用 (LRU) 列表可反映緩衝區的使用情況。緩衝區將根據其被引用時間的遠近和引用頻率進行排序。因此。最常常使用且近期使用過的緩衝區將列在近期最常使用一端。傳入的塊先被拷貝到近期最少使用一端的緩衝區中,然後該緩衝區將被指定到列表中央。作為起點。
從這個起點開始。緩衝區根據使用情況在列表中上下移動。
緩衝區快速快取中的緩衝區能夠處於下面四種狀態之中的一個:
已連線:當前正將該塊讀入快速快取或正在寫入該塊。其他會話正等待訪問該塊。
乾淨的:該緩衝區眼下未連線,假設其當前內容(資料塊)將不再被引用,則能夠馬上執行過期處理。這些內容與磁碟保持同步,或者緩衝區包括塊的讀一致性快照。
空暇/未使用:緩衝區因例項剛啟動而處於空白狀態。此狀態與“乾淨的”狀態很相似,不同之處在於緩衝區未曾使用過。
灰:緩衝區不再處於連線狀態,但內容(資料塊)已更改,因此必須先通過 DBWn 將內容重新整理到磁碟,然後才幹執行過期處理。
server程式使用緩衝區快速快取中的緩衝區。而 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 共享server)。
庫快速快取:庫快速快取包括共享 SQL 區和 PL/SQL 區 - 經過全然語法分析或編譯的 PL/SQL 塊和 SQL 語句的表示法。
PL/SQL 塊包括:
過程和函式
程式包
觸發器
匿名
PL/SQL 塊
資料字典快速快取:資料字典快速快取將字典物件的定義存放在記憶體中。
結果快速快取:結果快速快取包括 SQL 查詢結果快速快取和 PL/SQL 函式結果快速快取。此快速快取用於儲存 SQL 查詢或 PL/SQL 函式的結果。以加快其將來的執行速度。
使用者全域性區:UGA 包括 Oracle 共享server的會話資訊。使用共享server會話時。假設尚未配置大型池。則 UGA 位於共享池中。
3.大型池large pool
可配置為 SGA 中一個單獨的記憶體區
大小由 LARGE_POOL_SIZE 引數指定
用於在記憶體中為下面各項儲存資料:
--UGA
--備份和還原操作
--並行查詢訊息傳送
大型池必須顯式配置。大型池的記憶體不是來自共享池,而是直接來自 SGA。這就增大了 Oracle server在例項啟動時須要的共享記憶體量。
大型池用於為下面各項分配大量會話記憶體:
--I/O server程式
--備份和還原操作
--Oracle 共享server程式和 Oracle XA 介面(事務處理與多個資料庫互動時使用)
因為從大型池為 Oracle 共享server分配會話記憶體,因此共享池中因為頻繁分配和取消分配大物件而產生的碎片也就非常少。將大物件從共享池中分離出來。可新增共享池記憶體的使用效率,這意味著,它能夠將很多其它記憶體用於處理新的請求。以及在須要時用於保留現有資料。
4.Java pool
可配置為 SGA 中一個單獨的記憶體區
大小由 JAVA_POOL_SIZE 引數指定
用於將 JVM 中特定於會話的全部 Java 程式碼和資料儲存在記憶體中
5.重做日誌緩衝區 redo buffer cache
Oracle server程式將重做條目從使用者的記憶體空間拷貝到每一個 DML 或 DDL 語句的重做日誌緩衝區。重做條目包括重建或重做 DML 和 DDL 操作對資料庫的更改所必需的資訊。它們用於資料庫恢復,須要佔用緩衝區中的連續空間。
重做日誌緩衝區是一個迴圈緩衝區。server程式能夠用新條目覆蓋重做日誌緩衝區中已寫入磁碟的條目。LGWR 程式的寫速度通常都非常快,足以確保緩衝區中始終有儲存新條目的空間。LGWR 程式將重做日誌緩衝區寫入磁碟上的活動聯機重做日誌檔案(或活動組成員)中。LGWR 程式將 LGWR 上次寫入磁碟以來進入緩衝區的全部重做條目拷貝到磁碟。
什麼導致 LGWR 執行寫操作?
使用者程式提交事務處理時
每隔三秒,或每當重做日誌緩衝區佔滿三分之中的一個時
DBWn 程式將改動的緩衝區寫入磁碟時(假設對應的重做日誌資料尚未寫入磁碟)