記憶體架構

本章探討資料庫執行處理的記憶體架構。

Oracle AI Database 記憶體結構簡介

啟動執行處理時,Oracle AI Database 會配置記憶體區域,並啟動背景處理作業。

記憶體區域會儲存下列資訊:

基本記憶體結構

Oracle AI Database 包含數個記憶體區域,每個區域都包含多個子元件。

與 Oracle AI Database 相關的基本記憶體結構包括:

下圖說明這些記憶體結構之間的關係。

圖 1:Oracle AI Database 記憶體結構

cncpt217.png 圖解描述

Oracle AI Database 記憶體管理

記憶體管理包含維護 Oracle 執行處理記憶體結構最佳大小,以符合資料庫變更的需求。Oracle AI Database 會根據記憶體相關初始化參數的設定來管理記憶體。

記憶體管理的基本選項如下:

如果您使用「資料庫組態輔助程式 (DBCA)」建立資料庫並選擇基本安裝選項,則預設為自動記憶體管理。

另請參閱:

系統整體區域 (SGA) 總覽

SGA 是一個讀取 / 寫入記憶體區域,以及 Oracle 背景處理作業,都會形成一個資料庫執行處理。注意:伺服器和背景處理作業不在 SGA 之中,但存在於個別的記憶體空間中。

代表使用者執行的所有伺服器處理作業都可以讀取執行處理 SGA 中的資訊。在資料庫作業期間,有數個處理作業會寫入 SGA。

每個資料庫執行處理都有自己的 SGA。Oracle AI Database 會在執行處理啟動時自動配置 SGA 的記憶體,並在執行處理關閉時回收記憶體。當您使用 SQL*Plus 或 Oracle Enterprise Manager 啟動執行處理時,會顯示 SGA 的大小,如下列範例所示:

SQL> STARTUP
ORACLE instance started.

Total System Global Area  368283648 bytes
Fixed Size                  1300440 bytes
Variable Size             343935016 bytes
Database Buffers           16777216 bytes
Redo Buffers                6270976 bytes
Database mounted.
Database opened.

如圖 17-1 所示,SGA 包含數個記憶體元件,這些元件是用來滿足特定類別之記憶體配置要求的記憶體集區。除了重做日誌緩衝區以外的所有 SGA 元件,都會以稱為 granules 的連續記憶體單位來配置和取消配置空間。顆粒大小是平台特定的大小,由 SGA 總大小決定。

您可以查詢 V$SGASTAT 視觀表,瞭解 SGA 元件的相關資訊。

最重要的 SGA 元件如下:

另請參閱:

資料庫緩衝區記憶體快取

資料庫緩衝區快取 (亦稱為緩衝區快取 ) 是儲存從資料檔讀取之資料區塊複本的記憶體區域。

緩衝區是一個主要記憶體位址,緩衝區管理程式會在此暫時快取目前或最近使用的資料區塊。所有同時連線至資料庫執行處理的使用者會共用對緩衝區快取的存取權。

資料庫緩衝區快取的用途

Oracle AI Database 使用緩衝區快取來達成多個目標。

目標包括:

另請參閱:

緩衝區狀態

資料庫使用內部演算法來管理快取中的緩衝區。

緩衝區可處於下列任何互斥狀態:

每個緩衝區都有存取模式:已固定或可用 (未固定)。緩衝區在快取中是「固定」,因此在使用者階段作業存取緩衝區時,它不會發生記憶體不足的情況。多個階段作業無法同時修改固定的緩衝區。

緩衝區模式

當從屬端要求資料時,Oracle AI Database 會以目前模式或一致模式從資料庫緩衝區快取擷取緩衝區。

模式有下列不同:

另請參閱:

緩衝區 I/O

邏輯 I/O (又稱為緩衝區 I/O) 是指緩衝區快取中緩衝區的讀取和寫入。

在記憶體中找不到要求的緩衝區時,資料庫會執行實體 I/O,將緩衝區從快閃快取或磁碟複製到記憶體中。接著資料庫會執行邏輯 I/O 以讀取快取的緩衝區。

緩衝區取代演算法

為了讓緩衝區存取更有效率,資料庫必須決定要在記憶體中快取哪些緩衝區,以及要從磁碟存取哪些緩衝區。

資料庫使用下列演算法:

另請參閱:Oracle AI Database VLDB and Partitioning Guide,以深入瞭解以溫度為基礎的演算法

緩衝區寫入

資料庫寫入器 (DBW) 處理作業會定期將冷、已修改的緩衝區寫入磁碟。

DBW 會在下列情況下寫入緩衝區:

另請參閱:

緩衝區讀取

當未使用的緩衝區數目過低時,資料庫必須從緩衝區快取中移除緩衝區。

此演算法取決於是否啟用快閃快取:

當從屬端處理作業要求緩衝區時,伺服器處理作業會搜尋緩衝區快取中的緩衝區。如果資料庫在記憶體中找到緩衝區,就會發生快取命中。搜尋順序如下:

  1. 伺服器處理作業會在緩衝區快取中搜尋整個緩衝區。

    如果處理作業找到整個緩衝區,則資料庫會執行此緩衝區的邏輯讀取。

  2. 伺服器處理作業會搜尋快閃快取 LRU 清單中的緩衝區標頭。

    如果處理作業找到緩衝區標頭,則資料庫會對緩衝區主體從快閃快取執行最佳化實體讀取至記憶體內快取。

  3. 如果處理作業未在記憶體中找到緩衝區 (快取遺漏),則伺服器處理作業會執行下列步驟:

    1. 將區塊從磁碟上的資料檔複製到記憶體 (實體讀取)

    2. 執行已讀取記憶體中緩衝區的邏輯讀取

圖 17-2 說明緩衝區搜尋順序。擴充的緩衝區快取包含了記憶體內的緩衝區快取 (內含整個緩衝區),以及內含緩衝區內容的快閃快取。在圖中,資料庫會搜尋緩衝區快取中的緩衝區,如果沒有找到緩衝區,會從磁性磁碟將它讀取到記憶體中。

圖 2:緩衝區搜尋

cncpt304.gif 圖解描述

一般而言,透過快取命中存取資料會比透過快取遺漏更快。緩衝區快取命中率會測量資料庫在緩衝區快取中找到要求之區塊的頻率,而不需要從磁碟讀取區塊。

資料庫可以從資料檔或 temp 檔案執行實體讀取。資料檔的讀取之後為邏輯 I/O。當記憶體不足,導致資料庫將資料寫入暫時表格,並於稍後重新讀取時,就會發生暫存檔的讀取。這些實體讀取會略過緩衝區快取,不會產生邏輯 I/O。

另請參閱:Oracle AI Database Performance Tuning Guide,瞭解如何計算緩衝區快取命中率

緩衝區接觸計數

資料庫會使用觸控計數,測量 LRU 清單上緩衝區的存取頻率。此機制可讓資料庫在固定緩衝區時 (而非 LRU 清單上不斷打亂的緩衝區) 遞增計數器。

注意:資料庫不會實際移動記憶體中的區塊。移動是指清單中指標的位置變更。

固定緩衝區時,資料庫會決定其接觸計數的上次增量時間。如果計數在三秒前遞增,則計數會遞增;否則,計數會保持不變。3 秒規則可防止緩衝區上的接腳激增次數過多。例如,階段作業可以在資料區塊中插入多個資料列,但資料庫會將這些插入視為一次。

如果緩衝區位於 LRU 的冷端,但其接觸計數很高,則緩衝區會移至熱端。如果接觸計數過低,則緩衝區會過時。

緩衝區儲存池

緩衝區集區是緩衝區的集合。

資料庫緩衝區快取會分割成一或多個緩衝區集區,以大致相同的方式管理區塊。集區對帳齡或快取區塊沒有極為不同的演算法。

您可以手動設定個別的緩衝區集區,以將資料保留在緩衝區快取中,或在使用資料區塊之後立即將緩衝區提供給新資料使用。接著,您可以將特定的綱要物件指派給適當的緩衝區集區,以控制區塊超出快取時的時效。例如,您可以將區段分隔成熱緩衝區、暖緩衝區集區。

可能的緩衝區集區如下:

資料庫具有標準區塊大小。您可以建立一個區塊大小與標準大小不同的表格空間。每個非預設區塊大小都有自己的集區。Oracle AI Database 管理這些集區中的區塊的方式與預設集區中的區塊相同。

下圖顯示使用多個集區時,緩衝區快取的結構。快取包含預設、保留及回收集區。預設的區塊大小為 8 KB。此快取包含不同的集區,適用於使用非標準區塊大小為 2 KB、4 KB 以及 16 KB 的表格空間。

圖 3:資料庫緩衝區快取

cncpt220.gif 圖解描述

另請參閱:

緩衝區和完整表格掃描

資料庫使用複雜的演算法來管理表格掃描。依照預設,當必須從磁碟讀取緩衝區時,資料庫會將緩衝區插入 LRU 清單的中間。如此一來,熱區塊就可以保留在快取中,因此不需要再從磁碟讀取它們。

問題是由完整表格掃描構成,此掃描會依序讀取高水位標記 (HWM) 表格下的所有資料列。假設表格區段中的區塊大小總計大於緩衝區快取的大小。對此表格進行完整掃描可清除緩衝區快取,防止資料庫維護經常存取之區塊的快取。

完整表格掃描的預設模式

依照預設,只有當表格大小佔緩衝區快取的小百分比時,資料庫會採用保守的方法來完整表格掃描,將小型表格載入記憶體。

為了判斷是否應快取中型表格,資料庫會使用包含上次表格掃描之間的間隔、緩衝區快取的時效時戳,以及緩衝區快取中剩餘的空間的演算法。

對於非常大型的表格,資料庫通常會使用直接路徑讀取,此讀取會直接將區塊載入 PGA 並一起略過 SGA,以避免填入緩衝區快取。如果是媒體大小表格,資料庫可能會使用直接讀取或快取讀取。如果資料庫決定使用快取讀取,則會將區塊置於 LRU 清單結尾,以防止掃描有效地清除緩衝區快取。

從 Oracle Database 12c 版本 1 (12.1.0.2) 開始,資料庫執行處理的緩衝區快取會自動執行內部計算,以判斷記憶體是否足以讓資料庫在執行處理 SGA 中完整快取,以及存取時的快取表格是否對效能有幫助。如果整個資料庫可以完全融入記憶體中,且符合各種其他內部條件,則 Oracle AI Database 會將資料庫中的所有表格視為小型表格,並認為它們有資格進行快取。不過,資料庫不會快取以 NOCACHE 屬性標示的 LOB。

平行查詢執行

執行完整表格掃描時,資料庫有時可以使用多個平行執行伺服器來縮短回應時間。

在某些情況下,當資料庫的記憶體量較大時,資料庫可以快取系統整體區域 (SGA) 中的平行查詢資料,而不是使用直接路徑讀取程式整體區域 (PGA)。一般而言,由於可能的資源使用量,平行查詢會發生在低貨幣資料倉儲中。

另請參閱:

CACHE 屬性

在罕見的情況下,如果不需要預設快取行為,您可以使用 ALTER TABLE ... CACHE 變更大型表格的區塊讀取資料庫緩衝區快取的方式。

對於已設定 CACHE 屬性的表格,資料庫不會強制或固定緩衝區快取中的區塊。而是資料庫會依照與任何其他表格區塊相同的方式,將區塊移出快取。練習此選項時請小心,因為對大型表格進行完整掃描可能會將大部分其他區塊從快取中清除。注意:執行 ALTER TABLE ... CACHE 並不會因為要快取的表格。

KEEP 屬性

對於大型表格,您可以使用 ALTER TABLE ... STORAGE BUFFER_POOL KEEP,讓掃描將這些表格的區塊載入保留集區中。

將表格置於保留集區中,會變更儲存區塊的緩衝區快取部分。資料庫會將區塊快取到保留緩衝區集區中,而不是快取預設緩衝區集區中的區塊。沒有個別演算法控制保留集區快取。

另請參閱:

強制完整資料庫快取模式

為了改善某些情況的效能,您可以明確執行 ALTER DATABASE ... FORCE FULL DATABASE CACHING 敘述句來啟用強制使用完整資料庫快取模式。

與預設模式 (自動模式) 相較之下,強制完整資料庫快取模式會將整個資料庫 (包括 NOCACHE LOB) 視為適用於資料庫緩衝區快取中的快取。從 Oracle Database 12c 版本 1 (12.1.0.2) 開始,即可使用此模式。注意:啟用強制完整資料庫快取模式時,不會強制資料庫進入記憶體。相反地,整個資料庫適合在緩衝區快取中快取。Oracle AI Database 僅會在存取表格時快取表格。

Oracle 建議您,只有在每個個別執行處理的緩衝區快取大小大於資料庫大小時,才啟用強制完整資料庫快取模式。此準則適用於單一執行處理和 Oracle RAC 資料庫。不過,如果正確分割 Oracle RAC 應用程式,您就可以在所有執行處理的合併緩衝區快取 (使用額外的空間來處理執行處理之間重複的快取區塊) 大於資料庫大小時,啟用強制完整資料庫快取模式。

另請參閱:

DRAM 和 PMEM 緩衝區

標準 (DRAM) 資料庫緩衝區與 PMEM 緩衝區不同,但它們會共用特性。

設定「Oracle 永久記憶體檔案存放區 (PMEM 檔案存放區)」時,每個資料區塊都會直接對應至 DRAM 中的緩衝區快取。與 DRAM 緩衝區不同,PMEM 緩衝區不會複製資料區塊的內容。而是 PMEM 緩衝區標頭會指向 PMEM 檔案存放區中儲存的資料區塊。對於大多數的讀取,資料庫只會快取區塊描述資料,不會快取內容。PMEM 緩衝區使用特殊類型的顆粒,其結構與標準緩衝區快取顆粒不同。

注意:初始化參數 DB_CACHE_SIZE 指定 DRAM 快取的大小下限。此分攤不包含 PMEM 中繼資料製造費用。

PMEM 緩衝區可為下列任一狀態:

PMEM 的延遲比 DRAM 高。Oracle AI Database 使用以工作負載為基礎的內部演算法,來決定要從 PMEM 移轉到 DRAM 的區塊。

另請參閱:

重做日誌緩衝

重做日誌緩衝區是 SGA 中的循環緩衝區,用於儲存描述對資料庫所做之變更的重做項目。

重做記錄是一種資料結構,包含重新建構或重做 DML 或 DDL 作業對資料庫進行之變更的必要資訊。資料庫復原會將重做項目套用到資料檔,以重新建構遺失的變更。

資料庫處理作業會將重做項目從使用者記憶體空間複製到 SGA 中的重做日誌緩衝區。重做項目會在緩衝區中佔用連續的循序空間。背景處理作業日誌寫入器處理作業 (LGWR) 會將重做日誌緩衝區寫入至磁碟上的作用中線上重做日誌群組。圖 17-4 顯示此重做緩衝區活動。

圖 4:重做日誌緩衝區

cncpt226.gif 圖解描述

LGWR 會在 DBW 將分散的資料區塊寫入至磁碟時,依序將重做寫入至磁碟。散佈的寫入比循序寫入慢得多。因為 LGWR 可讓使用者避免等待 DBW 完成其慢速寫入,所以資料庫可提供更佳的效能。

LOG_BUFFER 初始化參數指定 Oracle AI Database 在緩衝重做項目時所使用的記憶體大小。與其他 SGA 元件不同的是,重做日誌緩衝區與固定 SGA 緩衝區不會將記憶體分成其他資料塊。

另請參閱:

共用集區

共用集區可快取各種類型的程式資料。

例如,共用集區會儲存剖析的 SQL、PL/SQL 程式碼、系統參數以及資料說明資訊。共用集區牽涉到資料庫中幾乎發生的每個作業。例如,如果使用者執行 SQL 陳述式,則 Oracle AI Database 會存取共用集區。

共用集區分為數個子元件,最重要的項目如圖 17-5 所示。

圖 5:共用集區

cncpt225.gif 圖解描述

本節包括下列主題:

程式庫緩衝區

程式庫快取是儲存可執行 SQL 和 PL/SQL 程式碼的共用集區記憶體結構。

此快取包含共用的 SQL 和 PL/SQL 區域,以及控制結構 (例如鎖定和程式庫快取處理)。在共用伺服器架構中,程式庫快取也包含專用 SQL 區域。

當執行 SQL 敘述句時,資料庫會嘗試重複使用先前執行的程式碼。如果程式庫快取中存在 SQL 敘述句的剖析表示法,而且可以共用,則資料庫會重複使用該程式碼,稱為軟剖析或程式庫快取命中。否則,資料庫必須建置應用程式程式碼的新可執行版本,稱為硬剖析或程式庫快取遺漏。

共用 SQL 區域

資料庫代表 SQL 敘述句在共用 SQL 區域和專用 SQL 區域中執行。

資料庫會使用共用 SQL 區域來處理第一次出現的 SQL 敘述句。所有使用者都可以存取此區域,而且包含敘述句剖析樹狀結構和執行計畫。唯一的敘述句只有一個共用 SQL 區域存在。發出 SQL 敘述句的每個階段作業在其 PGA 中都有專用 SQL 區域。每個提交相同敘述句的使用者都有一個專用 SQL 區域,指向相同的共用 SQL 區域。因此,不同 PGA 中的許多專用 SQL 區域都可以與相同的共用 SQL 區域產生關聯。

資料庫會自動決定應用程式何時提交類似的 SQL 陳述式。資料庫會考慮使用者與應用程式直接發出的 SQL 敘述句,以及由其他敘述句內部發出的遞迴 SQL 敘述句。

資料庫會執行下列步驟:

  1. 檢查共用集區,以查看語法上和語意上相同的敘述句是否有共用 SQL 區域:

    • 如果有相同的敘述句存在,則資料庫會使用共用 SQL 區域來執行敘述句的後續新執行處理,藉此減少記憶體使用量。

    • 如果沒有相同的敘述句,資料庫就會在共用集區中配置新的共用 SQL 區域。語法相同但語意不同的敘述句會使用子項游標。

    不論是哪一種狀況,使用者的專用 SQL 區域都會指向包含敘述句與執行計畫的共用 SQL 區域。

  2. 代表階段作業配置專用 SQL 區域

    專用 SQL 區域的位置取決於為階段作業建立的連線。如果階段作業是透過共用伺服器連線的,則專用 SQL 區域的一部分會保留在 SGA 中。

圖 17-6 顯示專用伺服器架構,其中兩個階段作業會在自己的 PGA 中保留相同 SQL 敘述句的複本。在共用伺服器中,此複本位於 MGA 中的 UGA 中。

圖 6:專用 SQL 區域與共用 SQL 區域

cncpt252.gif 圖解描述

另請參閱:

程式單元和程式庫快取

程式庫快取保存 PL/SQL 程式和 Java 類別的可執行形式。這些項目統稱為程式單元。

資料庫處理程序的程式單元與 SQL 陳述式類似。例如,資料庫會配置共用區域,以保存 PL/SQL 程式的已剖析、編譯形式。資料庫會配置專用區域,以保存執行程式之階段作業的特定值,包括本機、全域與套裝程式變數,以及執行 SQL 的緩衝區。如果多位使用者執行相同的程式,則每位使用者會維護其專用 SQL 區域的複本,此區域保存階段作業特定的值,並存取單一共用 SQL 區域。

資料庫會依照先前所述,處理 PL/SQL 程式單位內的個別 SQL 敘述句。儘管這些 SQL 敘述句的來源為 PL/SQL 程式單元,但是這些 SQL 敘述句還是會使用共用區域來保存它們的已剖析表示法,以及使用一個專用區域來保存每個執行該敘述句的階段作業。

共用集區中的記憶體配置與重複使用

資料庫會在剖析新的 SQL 敘述句時配置共用集區記憶體,除非該敘述句為 DDL,但不會被視為可共用。配置的記憶體大小會取決於敘述句的複雜性。

一般而言,共用集區中的項目會一直存在,直到資料庫根據最不常用 (LRU) 演算法將其移除為止。資料庫允許許多階段作業所使用的共用集區項目,只要它們很有用,即使建立該項目的資料庫處理作業已終止也一樣。此機制可將 SQL 陳述式的負荷與處理降到最低。如果新項目需要空間,則資料庫會釋出不常用項目所使用的記憶體。

ALTER SYSTEM FLUSH SHARED_POOL 陳述式會移除共用集區中的所有資訊,就像變更全域資料庫名稱一樣。

另請參閱:

資料字典快取

資料說明是一個資料庫表格與視觀表的集合,其中包含資料庫、結構和使用者的參照資訊。

Oracle AI Database 在 SQL 陳述式剖析期間經常存取資料字典。Oracle AI Database 經常會存取資料字典,指定下列特殊記憶體位置來保留字典資料:

所有的伺服器處理作業都會共用這些快取以存取資料說明資訊。

另請參閱:

伺服器結果快取

伺服器結果快取是共用集區中的記憶體集區。與緩衝區集區不同,伺服器結果快取保留了結果集,而非資料區塊。注意:從屬端結果快取與伺服器結果快取不同。用戶端快取是在應用程式層級設定,並位於用戶端記憶體中,而不是在資料庫記憶體中。

SQL 查詢結果快取

SQL 查詢結果快取是伺服器結果快取的子集,用來儲存查詢與查詢片段的結果。您可以在資料庫或敘述句層次啟用或停用結果快取。

當查詢執行時,資料庫會決定結果是否存在於查詢結果快取中。如果未快取結果,且已為查詢啟用快取,則資料庫會執行查詢、傳回結果,然後加以快取。不過,如果結果存在,則資料庫會從快取中擷取結果,而非執行查詢。

每當交易修改用來建構結果的資料庫物件資料或描述資料時,資料庫就會自動使快取的結果失效。下一個查詢無法使用快取的結果,因此資料庫會自動計算新的結果,然後將它快取供後續查詢使用。快取重新整理程序對應用程式而言是通透的。

查詢結果快取實際上是作為資料庫視需要建立和維護的「即時調整」具體化視觀表。快取可讓資料庫避免重新讀取資料區塊和重新計算結果的作業太貴。大部分應用程式都可從這項效能提升中獲益。

另請參閱:Oracle AI Database Administrator's Guide,瞭解如何使用查詢結果快取將回應時間最佳化

PL/SQL 函數結果快取

PL/SQL 函數結果快取是伺服器結果快取的子集,用來儲存函數結果集。

如果沒有快取,每次呼叫 1 秒時 1000 次呼叫的 PL/SQL 函數將需要 1000 秒。使用快取時,具有相同輸入值的 1000 個函數呼叫可能需要 1 秒 total 。適合結果快取的候選項目是經常呼叫的函數,這些函數取決於相對靜態資料。

PL/SQL 函數程式碼可以包含快取其結果的要求。呼叫此功能時,系統會檢查快取。如果快取包含先前具有相同參數值之函數呼叫的結果,則系統會將結果傳回給呼叫者,且不會重新執行函數主體。如果快取未包含結果,則系統會先執行函數主體並將結果 (針對這些參數值) 新增至快取,再將控制項傳回給呼叫者。

注意:您可以指定用來計算快取結果的資料庫物件,如此一來,如果更新任何物件,快取的結果就會變成無效,而且必須重新計算。

使用不同引數經常呼叫的函數可能會產生很少重複使用的結果,因而導致效能降低。Oracle AI Database 會追蹤具有 RESULT_CACHE 提示的最近使用 PL/SQL 函數。使用此歷史記錄時,資料庫只有在最近的歷史中見到 PL/SQL 函數與引數組 x 次,其中 x 是由內部臨界值設定的時,才會快取該函數與引數組。如果資料庫因快取過多的結果而需要更多記憶體,則一或多個快取的結果會過時。

RESULT_CACHE_EXECUTION_THRESHOLD 指定函數和一組特定引數必須經過的次數,直到快取為止。請注意,如果函數具有不同的引數 (例如 MYFUNC(1,2) 和 MYFUNC(1,3)),就會被視為唯一函數。您只能在系統層次設定此參數,不能在階段作業層次設定。

另請參閱:

伺服器結果快取基礎架構

查詢結果快取與 PL/SQL 函數結果快取共用相同的基礎架構。

物件類型:結果、相依性和暫時性

在伺服器結果快取中,結果物件是資料結構,可儲存查詢或 PL/SQL 函數傳回的資料列。相依性物件會儲存儲存為結果物件之查詢所參照物件的描述資料。

典型的查詢結果很小,運算成本很高,經常重複使用,而且是以非揮發性表格為基礎。不過,結果有時可能會很大。如果查詢結果通過大小限制,則資料庫會將部分結果儲存為 temp 物件,並儲存為標準結果物件。暫時物件是結果快取描述資料集合,這些描述資料會指向保存實際查詢結果的暫時表格空間區段。

結果子快取

視工作負載而定,資料庫可能會在讀取 / 寫入存取期間建立結果子快取,以支援更高的並行性。Oracle AI Database 使用內部演算法來決定是否建立子快取,如果是,還要建立多少子快取。

伺服器結果快取使用者介面

RESULT_CACHE_MODE 初始化參數決定 SQL 查詢結果快取是用於所有可能的查詢,還是僅用於提示的查詢。

RESULT_CACHE_MAX_TEMP_SIZE 初始化參數控制結果快取在 PDB 中可使用的暫時表格空間記憶體大小上限。RESULT_CACHE_MAX_TEMP_RESULT 控制一個快取的查詢所能使用的暫時表格空間記憶體大小上限。

若要覆寫 RESULT_CACHE_MODE 參數設定,您可以使用 RESULT_CACHE 提示加註查詢或查詢片段。從 Oracle Database 21c 開始,提示接受 TEMP={TRUE|FALSE} 選項,控制結果是否可以儲存在暫時表格空間中。

DBMS_RESULT_CACHE 套裝程式可讓您管理 SQL 結果快取和 PL/SQL 函數結果快取所使用之共用集區的該部分。您可以將物件、黑名單查詢和物件失效,以及執行相關作業。

V$RESULT_CACHE_OBJECTS.TYPE 資料欄代表快取中的物件類型。如果查詢結果儲存在暫時表格空間中,TYPE 就會顯示兩個物件:Result 和 Temp。您可以使用 V$RESULT_SUBCACHE_STATISTICS 和相關檢視來存取子快取描述資料。

另請參閱:

保留集區

保留集區是共用集區中的記憶體區域,Oracle AI Database 可用來配置大型連續區塊的記憶體。

資料庫會以區塊方式從共用集區配置記憶體。分區功能允許將大型物件 (超過 5 KB) 載入快取中,而不需要單一連續區域。如此一來,資料庫就會因為片段化而降低連續記憶體不足執行的可能性。

Java、PL/SQL 或 SQL 游標不常會從超過 5 KB 的共用集區進行配置。為了讓這些配置最有效率地發生,資料庫會為保留集區劃分少量的共用集區。

另請參閱:Oracle AI Database Performance Tuning Guide,瞭解如何設定保留集區

大型集區

大型集區是一種選擇性的記憶體區域,適用於比共用集區更大的記憶體配置。

大型集區可針對下列各項提供大型記憶體配置:

下圖說明大型集區。

圖 7:大型集區

cncpt221.png 圖解描述

另請參閱:

大型集區記憶體管理

大型集區會與共用集區管理不同的記憶體,而共用集區使用 LRU 清單,因此一部分的記憶體可能會超時。

大型集區沒有 LRU 清單。當資料庫將大型集區記憶體配置給資料庫階段作業時,除非階段作業釋出此記憶體,否則無法釋出此記憶體。只要釋出部分記憶體,其他處理作業就可以使用該記憶體。透過從大型集區配置階段作業記憶體,資料庫可避免在共用集區中可能發生的片段化。

延緩插入的大型集區緩衝區

對於特殊類型的插入 (稱為延緩插入 ),資料庫會從大型集區配置緩衝區。

為了從 Internet of Things (IoT) 應用程式快速插入「火燒」功能,資料庫基礎架構會造成效能負荷。例如,程式碼路徑包括緩衝區快取瀏覽、緩衝區接腳以及並行保護。陣列插入將這些成本降到最低,但陣列必須建立在用戶端上,這不是 Internet of Things 應用程式的典型選擇。若要解決此問題,Oracle 應用程式可以使用提示將資料列插入指定為 MEMOPTIMIZE FOR WRITE 的表格中。

插入是延緩的,因為它們在大型集區中緩衝處理,之後又是由背景處理作業以非同步方式寫入磁碟。資料庫處理作業的延遲插入如下:

  1. 應用程式會將 MEMOPTIMIZE_WRITE 插入傳送至可聚總資料的中間層。雖然 IoT 應用程式幾乎一律會傳送插入至中間層,但也可以直接將插入傳送至資料庫。例如,使用 SQL*Plus 會將插入項目直接傳送到資料庫。

  2. 中間層會將插入聚總寫入資料庫伺服器。

  3. (選擇性) 中間層從屬端會保留其在上一個步驟中所撰寫之資料的本機複本。

  4. 伺服器處理作業會將資料寫入大型集區中的緩衝區或緩衝區。

    為了避免競爭,每個緩衝區都有自己的內部鎖定機制。此鎖定機制與資料庫緩衝區快取用於其緩衝區的鎖定機制不同。基本寫入程序如下:

    1. 執行處理啟動後,第一個 MEMOPTIMIZE_WRITE 插入會從大型集區配置緩衝區。

    2. 寫入器會從可用緩衝區清單中選擇緩衝區。

    3. 如果選擇的緩衝區未鎖定,且此緩衝區有可用空間,則從屬端會寫入緩衝區,並以階段作業特定的序號為每個緩衝區寫入加戳記。如果沒有,則寫入器會返回先前的步驟,並以此方式繼續,直到在大型集區中找到緩衝區或已釋出足夠的空間為止。

  5. 資料庫會從緩衝資料建立伺服器端陣列。

  6. 空間管理協調器 (SMCO) 及其協助程式處理作業 (W nnn) 會使用標準資料區塊格式,以非同步方式將陣列寫入磁碟。

    與標準插入不同,延遲插入是自動確認的,無法倒回。資料庫會依照插入項目在階段作業中的顯示順序,將插入項目確認至指定的物件。您不保證能夠訂購 between 物件或階段作業。

    資料庫支援限制條件與索引維護,就像一般插入一樣。然而,資料庫在寫入至磁碟期間執行評估,而不是寫入大型集區。

    注意:為了獲得最佳效能,Oracle 建議您停用限制條件。

下圖說明延遲插入的工作流程。

圖 8:遞延 InsertMechanism

cncpt_pb_002a.png 圖解描述

另請參閱:

Java 集區

Java 集區是一個記憶體區域,可將所有階段作業特定的 Java 程式碼與資料儲存在 Java Virtual Machine (JVM) 中。此記憶體包含 Java 物件,這些物件會在呼叫結束時移轉至 Java 階段作業空間。

就專用伺服器連線而言,Java 集區會包含每個 Java 類別的共用部分,包括方法和唯讀記憶體 (例如程式碼向量),但不會包含每個階段作業的每個階段作業 Java 狀態。對於共用伺服器,集區會包含每個類別的共用部分,以及用於每個階段作業狀態的某些 UGA。每個 UGA 會視需要成長與縮小,但是 UGA 總大小必須符合 Java 集區空間。

「Java 集區建議程式」統計資料提供 Java 使用的程式庫快取記憶體資訊,並預測 Java 集區大小的變更如何影響剖析速率。當 statistics_level 設為 TYPICAL 或更新版本時,內部會開啟「Java 集區建議程式」。關閉建議程式時,這些統計資料會重設。

另請參閱:

固定的 SGA

固定 SGA 是內部房務部區域。

例如,固定的 SGA 包含:

固定 SGA 的大小是由 Oracle AI Database 所設定,無法手動更改。固定的 SGA 大小可能會從發行版本變更為發行版本。

另請參閱: 「自動鎖定概要」

選擇性效能相關 SGA 子區域

部分 SGA 子區域只針對特定的效能功能啟用。

本節包含下列主題:

記憶體式區域

「記憶體內區域」是選擇性的 SGA 元件,包含記憶體內資料欄存放區 (IM 資料欄存放區)。

IM 資料欄存放區包含針對快速掃描最佳化的資料欄格式表格、分割區以及具體化視觀表複本。IM 資料欄存放區會補充資料庫緩衝區快取,此快取以傳統資料列格式儲存資料。

注意:若要啟用 IM 資料欄存放區,您必須要有 Oracle AI Database In-Memory 選項。

另請參閱:Oracle AI Database In-Memory Guide,深入瞭解記憶體內區域和 IM 資料欄存放區

重複集區

memoptimize pool 會儲存指定為 MEMOPTIMIZE FOR READ 之堆集組織表格的緩衝區和相關結構。

此結構為關鍵型查詢 (例如 SELECT * FROM cust WHERE cid = 10) 提供高效能和擴展性。為了縮短端對端回應時間,用戶端會透過網路直接從 SGA 提取要求的緩衝區,避免 CPU 與作業系統負荷。應用程式無需變更程式碼,即可受益於記憶體最佳化集區。

memoptimize 集區包含兩個部分:

cncpt_pb_001a.png 圖解描述

若要啟用 memoptimize 集區,請將 MEMOPTIMIZE_POOL_SIZE 初始化參數設為整數值 (集區預設為停用)。此值指定要配置給集區的 SGA 數量。MEMOPTIMIZE_POOL_SIZE 值會計入 SGA_TARGET,但資料庫不會自動增加和縮小記憶體最佳化集區。例如,如果 SGA_TARGET 為 10 GB,且如果 MEMOPTIMIZE_POOL_SIZE 為 1 GB,則除了 memoptimize 集區之外,SGA 記憶體總計為 9 GB。

若要變更記憶體最佳化集區的大小,您必須手動設定 MEMOPTIMIZE_POOL_SIZE,然後重新啟動資料庫執行處理。您無法使用 ALTER SYSTEM 動態變更集區大小。

DBMS_MEMOPTIMIZE 套裝軟體可讓您將表格明確填入記憶體最佳化集區中。

另請參閱:

方案整體區域總覽 (PGA)

PGA 是系統上其他處理作業或繫線未共用之作業處理作業或繫線的特定記憶體。因為 PGA 是處理作業特定的,所以它永遠都不會配置在 SGA 中。

PGA 是記憶體堆集,其中包含專用或共用伺服器處理作業所需的階段作業相依變數。伺服器處理作業會配置 PGA 中所需的記憶體結構。

與 PGA 一樣,就是檔案工作人員所使用的暫時反彈工作區。在此類比中,檔案管理員是代表客戶 (從屬端處理作業) 執行工作的伺服器處理作業。工作人員會清除反彈的區段,使用工作區來儲存客戶要求的詳細資料,並排序客戶要求的資料夾,然後在工作完成時提供空間。

下圖顯示未針對共用伺服器設定之執行處理的執行處理 PGA (所有 PGA 的集合)。您可以使用初始化參數來設定執行處理 PGA 的目標大小上限。個別 PGA 可視需要成長到這個目標大小。

圖 10:執行處理 PGA

cncpt218.gif 圖解描述

注意:背景處理作業也會配置自己的 PGA。本討論只著重在伺服器處理作業 PGA。

PGA 的內容

PGA 分割成不同的區域,各有不同的用途。

下圖顯示專用伺服器階段作業的可能 PGA 內容。並非所有 PGA 區域都存在於各種情況下。

圖 11:PGA 內容

cncpt219.gif 圖解描述

專用 SQL 區域

專用 SQL 區域可保存已剖析之 SQL 敘述句的相關資訊,以及其他階段作業特定資訊以供處理。

當伺服器處理作業執行 SQL 或 PL/SQL 程式碼時,處理作業會使用專用 SQL 區域來儲存連結變數值、查詢執行狀態資訊,以及查詢執行工作區。

請勿混淆位於 PGA 中的專用 SQL 區域與在 SGA 中儲存執行計畫的共用 SQL 區域。同一個或不同階段作業中的多個專用 SQL 區域都可指向 SGA 中的單一執行計畫。例如,在一個階段作業中執行 20 次 SELECT * FROM sales,而在不同階段作業中執行 10 次同一個查詢,則可以共用相同的計畫。每次執行的專用 SQL 區域都不會共用,並可能包含不同的值與資料。

游標是特定專用 SQL 區域的名稱或控點。如下圖所示,您可以將游標視為從屬端上的指標,並視為伺服器端上的狀態。因為游標與專用 SQL 區域密切相關,所以有時術語會交替使用。

圖 12:游標

cncpt324.gif 圖解描述

專用 SQL 區域分成下列區域:

從屬端處理作業負責管理專用 SQL 區域。專用 SQL 區域的配置與取消配置大致取決於應用程式,雖然從屬端處理作業可以配置的專用 SQL 區域數目受初始化參數 OPEN_CURSORS 的限制。

雖然大多數使用者都仰賴資料庫公用程式的自動游標處理,但 Oracle AI Database 程式設計介面可讓開發人員更能掌控游標。一般而言,應用程式應該關閉不會再次使用的所有開啟游標,以釋放永久區域,並儘可能減少應用程式使用者所需的記憶體。

另請參閱:

SQL 工作區

工作區域是用於耗用大量記憶體作業的 PGA 記憶體專用配置。

例如,排序運算子使用排序區域來排序一組資料列。同樣地,雜湊結合運算子使用雜湊區域從其左方輸入建立雜湊表,而位元映射合併則使用位元映射合併區域來合併從多個位元映射索引掃描擷取的資料。

下列範例顯示 employees 和 departments 的結合及其查詢計畫:

SQL> SELECT *
  2  FROM   employees e JOIN departments d
  3  ON     e.department_id=d.department_id
  4  ORDER BY last_name;
.
.
.
--------------------------------------------------------------------------------
| Id| Operation           | Name        | Rows  | Bytes | Cost (%CPU)| Time    |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT    |             |   106 |  9328 |    7  (29)| 00:00:01 |
| 1 |  SORT ORDER BY      |             |   106 |  9328 |    7  (29)| 00:00:01 |
|*2 |   HASH JOIN         |             |   106 |  9328 |    6  (17)| 00:00:01 |
| 3 |    TABLE ACCESS FULL| DEPARTMENTS |    27 |   540 |    2   (0)| 00:00:01 |
| 4 |    TABLE ACCESS FULL| EMPLOYEES   |   107 |  7276 |    3   (0)| 00:00:01 |
--------------------------------------------------------------------------------

在前面的範例中,程式實際執行區域會追蹤完整表格掃描的進度。階段作業會在雜湊區域中執行雜湊結合,以比對兩個表格的資料列。ORDER BY 排序會出現在排序區域中。

如果操作員要處理的資料量無法放入工作區中,則 Oracle AI Database 會將輸入資料分割成較小的部分。如此一來,資料庫會在將剩餘資料寫入暫存磁碟儲存體以供日後處理時,處理記憶體中的部分資料片段。

啟用自動 PGA 記憶體管理時,資料庫會自動調整工作區大小。您也可以手動控制及調整工作區的大小。

一般而言,較大的工作區可以明顯改善運算子的效能,但代價是會耗用更多的記憶體。最佳化是,工作區的大小足以容納輸入資料,以及由其關聯 SQL 運算子配置的輔助記憶體結構。否則,回應時間會隨著輸入資料的一部分必須快取在磁碟上而增加。在極端情況下,如果工作區的大小與輸入資料大小太小,則資料庫必須對資料片段執行多次傳遞,大幅增加回應時間。

另請參閱:

專用與共用伺服器模式中的 PGA 使用狀況

PGA 記憶體配置取決於資料庫是使用專用或共用伺服器連線。

下表顯示差異。

表格 1 專用伺服器與共用伺服器之間的記憶體配置差異

記憶體區域 專用伺服器 共用伺服器
工作階段記憶體的性質 私人 分享
永久區域的位置 PGA SGA
DML 和 DDL 敘述句的程式實際執行區域位置 PGA PGA

另請參閱:Oracle AI Database Administrator's Guide,瞭解如何設定共用伺服器的資料庫

使用者整體區域概要

UGA 是階段作業記憶體,也就是配置給階段作業變數的記憶體,例如登入資訊,以及資料庫階段作業所需的其他資訊。基本上,UGA 會儲存階段作業狀態。

下圖說明 UGA。

圖 13:使用者整體區域 (UGA)

cncpt222.gif 圖解描述

如果階段作業將 PL/SQL 套裝程式載入記憶體,則 UGA 包含套裝程式狀態,這是一組在特定時間儲存在所有套裝程式變數中的值。套裝軟體子程式變更變數時,套裝軟體狀態也會變更。依照預設,套裝程式變數在階段作業期間是唯一的,而且會持續存在。

OLAP 頁面集區也會儲存在 UGA 中。此集區管理 OLAP 資料頁面,等同於資料區塊。頁面集區會在 OLAP 階段作業開始時配置,並在階段作業結束時釋出。每當使用者查詢維度物件 (例如立方體 ) 時,OLAP 階段作業就會自動開啟。

在階段作業的存留期間,UGA 必須可供資料庫階段作業使用。因此,使用共用伺服器連線時,無法將 UGA 儲存在 PGA 中,因為 PGA 是單一處理作業特定的。因此,使用共用伺服器連線時,會將 UGA 儲存在 MGA 中,以便讓任何共用伺服器處理作業都可以存取它。使用專用伺服器連線時,UGA 會儲存在 PGA 中。

另請參閱:

受管理全域區域 (MGA) 概要

「受管理整體區域 (MGA)」是唯一的記憶體架構,可跨一組信任的 Oracle 處理作業共用及協調記憶體。

它具有可設定、彈性、模組化、隨選、可復原的共用記憶體區域的功能。MGA 提供一種利用資料庫中不同類型之共用記憶體區域的方式。它被顯示為內部資料庫層的命名空間,而每個命名空間只屬於其中一個。命名空間主要是由一組共用記憶體區段及連同該區段的描述資料所組成。

資料庫中的圖層可以定義命名空間的特性、範圍、使用期限及內部區段大小。所有 MGA 都會列入 PGA 聚總限制之下。

在 Linux 上,MGA 需要掛載於 /dev/shm 的 tempfs,且至少設定為 PGA 聚總限制的大小。在同一部機器上執行多個執行處理時,所有執行處理的 /dev/shm 大小至少必須是 sum(PGA_AGGREGATE_LIMIT) 。

另請參閱:

軟體程式碼區域概要

軟體代碼區域是記憶體的一部分,用於儲存正在執行或可執行的程式碼。Oracle AI Database 程式碼儲存在軟體區域中,通常比使用者程式位置更為專屬且受到保護。

軟體區域的大小通常是靜態的,只有在更新或重新安裝軟體時才會變更。所需的範圍將依作業系統而有所不同。

軟體區域是唯讀的,可以安裝共用或非共用區域。部分資料庫工具和公用程式 (例如 Oracle Forms 與 SQL*Plus) 可以安裝共用,但有些則無法共用。如果可能,會共用資料庫程式碼,讓所有使用者不需要在記憶體中擁有多個複本即可存取資料庫程式碼,進而降低主要記憶體並改善效能。如果在同一部電腦上執行,資料庫的多個執行處理可以將相同的資料庫程式碼區域與不同的資料庫搭配使用。注意:安裝軟體共用的選項不適用於所有作業系統,例如,在操作 Microsoft Windows 的 PC 上。如需詳細資訊,請參閱作業系統特定文件。