天天看點

Oracle Database 19c 技術架構(二)

Oracle官方文檔中給出的Oracle Database 19c技術架構圖,可以看出制作者的用心和精心。同時本文可以作為學習Oracle體系結構很好的教材!值得大家收藏!

06、共享池(shared pool)

Oracle Database 19c 技術架構(二)

共享池是系統全局區 (SGA) 的組成部分,負責緩存各種類型的程式資料。例如,共享池存儲已解析的SQL,PL/SQL代碼,系統參數和資料字典資訊。共享池⼏乎涉及資料庫中發⽣的每個操作。例如,如果⽤戶執⾏SQL語句,則Oracle資料庫将通路共享池。

共享池分為⼏個⼦元件:

•庫⾼速緩存 (Library cache):是⼀種共享池記憶體結構,⽤于存儲可執⾏的 SQL和PL/SQL代碼。該緩存包含共享的SQL和PL/SQL區域以及控制結構,例如鎖和庫緩存句柄。當執⾏SQL語句時,資料庫嘗試重⽤以前執⾏的代碼。如果庫⾼速緩存中存在SQL語句的已解析表示形式并且可以共享,則資料庫将重⽤代碼。此操作稱為軟解析或庫⾼速緩存命中。否則,資料庫必須建構應⽤程式代碼的新的可執⾏版本,這稱為硬解析或庫⾼速緩存未命中。

•保留池 (Reserved pool):是共享池中的⼀個記憶體區域,Oracle資料庫可使⽤ 該記憶體區域來配置設定連續的⼤塊記憶體。資料庫從共享池中按照Chunk⽅式配置設定記憶體。Chunk允許将⼤型對象(超過5 KB)加載到緩存中,⽽⽆需單個連續區域。這樣,資料庫減少了由于碎⽚⽽耗盡連續記憶體的可能性。

•資料字典⾼速緩存 (Data dictionary cache):存儲有關資料庫對象的資訊(即字典資料)。此緩存也稱為⾏緩存,因為它将資料儲存為⾏⽽不是緩沖區。

•伺服器結果緩存 (Server result cache):是共享池中的⼀個記憶體池,并儲存結果集。伺服器結果緩存包含SQL查詢結果緩存和PL/SQL函數結果緩存,它們共享相同的基礎結構。SQL查詢結果緩存存儲查詢和查詢⽚段的結果。⼤多數應⽤程式都受益于這種性能改進。PL/SQL函數結果緩存存儲函數結果集。結果緩存的良好候 選者是經常調⽤的函數,這些函數依賴于相對靜态的資料。

•其他元件 (Other components):包括隊列,鎖存器,資訊⽣命周期管理 (ILM) 位圖表,活動會話曆史記錄 (ASH) 緩沖區和其他次要記憶體結構。排隊是共享 的記憶體結構(鎖),⽤于序列化對資料庫資源的通路。它們可以與會話或事務相關 聯。例如:控制⽂件事務,資料⽂件,執行個體恢複,媒體恢複,事務恢複,作業隊列等。鎖存器⽤作低級序列化控制機制,⽤于保護SGA中的共享資料結構免于同時通路。例如:⾏⾼速緩存對象,庫⾼速緩存pin和⽇志⽂件并⾏寫⼊。

注意:更多詳細資訊,請看如下内容:Shared Pool.

07、⼤池(Large Pool)

Oracle Database 19c 技術架構(二)

⼤池是資料庫管理者可以配置的可選記憶體區域,可以為以下各項提供⼤記憶體配置設定:

•⽤戶全局區域 (UGA):共享伺服器和Oracle XA接⼝的會話記憶體(⽤于事務與多個資料庫互動)

•I/O 緩沖區 (I/O Buffer Area):I/O伺服器程序,并⾏查詢操作中使⽤的消息緩沖區,Recovery Manager (RMAN) I/O從屬程序的緩沖區,以及存儲⾼級排隊記憶體表。

•延遲插⼊池 (Deferred Inserts Pool):快速提取功能可将資料庫中定義為MEMOPTIMIZE FOR WRITE的表進⾏⾼頻單⾏資料插⼊。快速攝取的插⼊物也稱 為延遲插⼊物。它們初在⼤緩沖池中緩沖,然後在每個對象每個會話每次寫⼊1MB或60秒後由空間管理協調器 (SMCO) 和Wxxx從屬背景程序異步寫⼊磁盤。在SMCO背景程序進⾏掃描之前,任何會話(包括寫⼊的會話)都⽆法讀取該緩沖池中緩沖的任⼀資料,即使已送出的會話。該池在⼤型池中被初始化是在第⼀⾏資料 插⼊memoptimized 表時進⾏。當有⾜夠的空間時,将從⼤型池中配置設定2G。如果⼤型池中沒有⾜夠的空間,則會在内部發現并⾃動清除ORA-4031,然後使⽤⼀半的 請求記憶體⼤⼩重試配置設定。如果⼤型池中仍然沒有⾜夠的空間,則使⽤512M和256M 重試配置設定,然後禁⽤該功能,直到重新啟動執行個體。初始化池後,⼤⼩将保持不變。它不能增⻓或收縮。

•可⽤記憶體

⼤型池與共享池中的保留白間不同,共享池中的保留白間與從共享池配置設定的其他 記憶體使⽤相同的近少使⽤ (LRU) 清單。⼤池沒有LRU清單。記憶體已配置設定,在使⽤完之前⽆法釋放。

來⾃⽤戶的請求是單個API調⽤,屬于⽤戶的SQL語句。在專⽤伺服器環境中,⼀個伺服器程序處理單個用戶端程序的請求。每個伺服器程序都使⽤系統資源,包括CPU周期和記憶體。在共享伺服器環境中,将發⽣以下操作:

1.用戶端應⽤程式向資料庫執行個體發送請求,并且分派程序接收該請求。

2. 分派程序将請求放在⼤池中的請求隊列上。

3. 下⼀個可⽤的共享伺服器程序将處理該請求。共享伺服器程序檢查公共請求 隊列中是否有新請求,并以先進先出的⽅式接收新請求。⼀個共享伺服器進 程在隊列中接收⼀個請求。

4. 共享伺服器程序對資料庫進⾏所有必要的調⽤以完成請求。⾸先,共享伺服器程序通路共享池中的庫緩存以驗證請求的項⽬;例如,它檢查表是否存在,⽤戶是否具有正确的特權等等。接下來,共享伺服器程序通路緩沖區⾼速緩存以檢索資料。如果資料不存在,則共享伺服器程序将通路磁盤。不同的共享伺服器程序可以處理每個資料庫調⽤。是以,解析查詢,擷取第⼀⾏,擷取下⼀⾏以及關閉結果集的請求可能分别由不同的共享伺服器程序處理。由于不同的共享伺服器程序可能會處理每個資料庫調⽤,是以⽤戶全局區域 (UGA) 必須是共享記憶體區域,因為UGA包含有關每個用戶端會話的信 息。反過來說,UGA包含有關每個用戶端會話的資訊,并且必須對所有共享伺服器程序可⽤,因為任何共享伺服器程序都可以處理任何會話的資料庫調⽤。

5. 請求完成後,共享伺服器程序将響應放置在⼤型池中的呼叫分派程序的響應隊列上。每個分派程序都有⾃⼰的響應隊列。

6. 響應隊列将響應發送到分派程序。

7. 分派程序将完成的請求傳回到适當的用戶端應⽤程式。

注意:更多詳細資訊,請看如下内容:Large Pool.

08、資料庫⾼速緩沖區(Database Buffer Cache)

Oracle Database 19c 技術架構(二)

資料庫緩沖區⾼速緩存,也稱為緩沖區⾼速緩存,是系統全局區域 (SGA) 中的存儲區域,⽤于存儲從資料⽂件讀取的資料塊的副本。緩沖區是資料庫塊⼤⼩的記憶體 塊。每個緩沖區都有⼀個稱為資料庫緩沖區位址 (DBA) 的位址。同時連接配接到資料庫執行個體的所有⽤戶共享對緩沖區⾼速緩存的通路。緩沖區⾼速緩存的⽬标是優化實體I/O, 并将經常通路的塊保留在緩沖區⾼速緩存中,并将不經常通路的塊寫⼊磁盤。

Oracle資料庫⽤戶程序第⼀次需要特定資料時,它将在資料庫緩沖區⾼速緩存中搜尋資料。如果程序發現緩存中已存在的資料(緩存命中),則可以直接從記憶體中讀取資料。如果該程序在緩存中找不到資料(緩存未命中),則它必須在通路資料之前 将資料塊從磁盤上的資料⽂件複制到緩存中的緩沖區中。通過緩存命中通路資料⽐通 過緩存未命中通路資料更快。

⾼速緩存中的緩沖區由複雜算法管理,該算法使⽤近少使⽤ (LRU) 清單和 Touch Count算法的組合。LRU有助于確定近使⽤的塊傾向于保留在記憶體中,以 ⼤程度地減少磁盤通路。

資料庫⾼速緩沖區包括以下内容:

•預設池 (Default pool):是通常緩存塊的位置。預設塊⼤⼩為8 KB。除⾮您⼿動配置單獨的池,否則預設池是唯⼀的緩沖池。其他池的可選配置對預設池⽆效。

•保留池 (Keep pool):适⽤于經常通路但由于空間不⾜⽽在預設池中過期的塊。保留緩沖池的⽬的是在記憶體中保留指定的對象,從⽽避免I/O操作。

•回收池 (Recycle pool):⽤于不經常使⽤的塊。回收池可防⽌指定的對象占⽤緩存中不必要的空間。

•⾮預設緩沖池 (Non-default buffer pools):适⽤于使⽤2 KB,4 KB,16 KB 和32 KB⾮标準塊⼤⼩的表空間。每個⾮預設塊⼤⼩都有其⾃⼰的池。Oracle資料庫以與預設池相同的⽅式管理這些池中的塊。

•資料庫智能閃存緩存 (Flash cache):使您可以使⽤閃存裝置來增加緩沖區緩 存的有效⼤⼩,⽽⽆需添加更多主記憶體。閃存緩存可以通過将資料庫緩存的需頻繁 通路的資料存儲到閃存中⽽不是從磁盤讀取資料來提⾼資料庫性能。當資料庫請求 資料時,系統⾸先在資料庫緩沖區⾼速緩存中查找。如果找不到資料,則系統将在 資料庫智能閃存緩存中查找。如果它在那⾥找不到資料,則隻會在磁盤存儲中查 找。您必須在Oracle Real Application Clusters環境中的所有執行個體上配置閃存緩存, 或者不配置任何節點的閃存存儲。

•最近最少使⽤清單(LRU):包含指向髒緩沖區和⾮髒緩沖區的指針。LRU 清單有⼀個熱端和⼀個冷端。冷緩沖區是近未使⽤過的緩沖區。熱緩沖區經常被 通路并且近已經被使⽤。從概念上講,隻有⼀個LRU,但是對于資料并發,資料 庫實際上使⽤了多個LRU。

•檢查點隊列 (Checkpoint queue):檢查點隊列是⼀個連結清單結構,是由緩沖區 頭部結構構成;當資料塊被修改後,緩沖區通過此連結清單結構來跟蹤資料塊的修改。連結清單的順序是根據早應⽤于該資料塊的RBA(Redo Block Address)位址排序得到的。

•Flash緩沖區 (Flash Buffer Area):由DEFAULT Flash LRU鍊和KEEP Flash LRU鍊組成。如果沒有資料庫智能閃存緩存,則當程序嘗試通路某個塊并且該塊在 緩沖區緩存中不存在時,該塊将⾸先從磁盤讀⼊記憶體(實體讀取)。當記憶體中緩沖 區⾼速緩存已滿時,将根據近少使⽤ (LRU) 機制将緩沖區從記憶體中逐出。使⽤ Database Smart Flash Cache,當⼲淨的記憶體中緩沖區過期時,該緩沖區的内容将通過Database Writer程序 (DBWn) 在背景寫⼊閃存中,并且緩沖區頭作為中繼資料保留在記憶體中DEFAULT閃存或KEEP閃存LRU清單,具體取決于FLASH_CACHE對象屬性的值。KEEP閃存LRU清單⽤于将緩沖區頭保留在單獨的清單上,以防⽌正常緩沖區頭替換它們。是以,屬于指定為KEEP的對象的閃存緩沖區标頭傾向于在閃存緩存中保留更⻓時間。如果将FLASH_CACHE對象屬性設定為NONE,則系統不會在閃存緩存或記憶體中保留相應的緩沖區。當再次通路已過期的記憶體緩沖區時,系統将檢查閃存緩存。如果找到了緩沖區,它将從閃存緩存中讀回它,這僅花費從磁 盤讀取的時間的⼀⼩部分。跨實時應⽤程式群集 (RAC) 的閃存緩存緩沖區的⼀緻性 與緩存融合的維護⽅式相同。因為閃存⾼速緩存是擴充⾼速緩存,并且直接路徑I/O 完全繞過了緩沖區⾼速緩存,是以此功能不⽀持直接路徑I/O。請注意,系統不會将 髒緩沖區放⼊閃存緩存中,因為它可能必須将緩沖區讀取到記憶體中才能對它們進⾏ 檢查點,因為寫⼊閃存緩存不會計⼊檢查點。

注意:更多詳細資訊,請看如下内容:Database Buffer Cache.

09、記憶體中列式存儲區(In-Memory Area)

Oracle Database 19c 技術架構(二)

In-Memory存儲區是⼀個可選的SGA元件,其中包含記憶體中列存儲(IM列存 儲),該存儲區使⽤針對快速掃描進⾏了優化的列格式将表和分區存儲在記憶體中。IM 列存儲使資料能夠以傳統的⾏格式(在緩沖區⾼速緩存中)和列格式同時在SGA中填充。資料庫透明地将線上事務處理 (OLTP) 查詢(例如主鍵查找)發送到緩沖區⾼速緩存,并将分析和報告查詢發送到IM列存儲。在擷取資料時,Oracle資料庫還可以從同⼀查詢中的兩個記憶體區域讀取資料。雙格式體系結構不會使記憶體需求加倍。緩沖區⾼速緩存經過優化,可以以⽐資料庫⼩得多的⼤⼩運⾏。

您應該僅在IM列存儲中填充關鍵的資料。要将對象添加到IM列存儲中,請在建立或更改對象時為該對象打開INMEMORY屬性。您可以在表空間(對于表空間中的所 有新表和視圖),表,(⼦)分區,物化視圖或對象内的列⼦集上指定此屬性。

IM列存儲以優化的存儲單元(⽽不是傳統的Oracle資料塊)管理資料和中繼資料。記憶體中壓縮單元 (IMCU) 是⼀種壓縮的隻讀存儲單元,其中包含⼀個或多個列的數 據。快照中繼資料單元 (SMU) 包含相關IMCU的中繼資料和事務資訊。每個IMCU都映射到 ⼀個單獨的SMU。

表達式統計資訊存儲 (ESS) 是⼀個存儲有關表達式評估的統計資訊的存儲庫。ESS駐留在SGA中,并且也保留在磁盤上。啟⽤IM列存儲後,資料庫會将ESS⽤于其 記憶體中表達式(IM表達式)功能。記憶體中表達單元 (IMEU) 是⽤于存儲實作的IM表達式和⽤戶定義的虛拟列的存儲容器。請注意,ESS獨⽴于IM列存儲。ESS是資料庫的永久元件,不能禁⽤。

從概念上講,IMEU是其⽗IMCU的邏輯擴充。就像IMCU可以包含多個列⼀樣,IMEU可以包含多個虛拟列。每個IMEU都恰好映射到⼀個IMCU,映射到同⼀⾏集。IMEU包含與其關聯的IMCU中包含的資料的表達結果。填充IMCU後,還将填充關聯 的IMEU。

典型的IM表達式包含⼀列或多列(可能帶有常量),并且與表中的⾏具有⼀對⼀的映射關系。例如,⼀個EMPLOYEES表的IMCU包含Weekly_salary列的1-1000⾏。對于此IMCU中存儲的⾏,IMEU計算⾃動檢測到的IM表達式weekly_salary * 52,并将 ⽤戶定義的虛拟列Quarterly_salary定義為weekly_salary * 12。IMCU中的第三⾏下映 射到IMEU中的第三⾏下。

In-Memory區細分為兩個池:⼀個1MB列式資料池,⽤于存儲填充到記憶體中的實 際列格式資料 (IMCU和IMEU),以及⼀個64K中繼資料池,⽤于存儲有關對象的元數 據。填充到IM列存儲中。這兩個庫的相對⼤⼩由内部啟發算法确定。In-Memory區中 的⼤部分記憶體都配置設定給1MB池。記憶體區域的⼤⼩由初始化參數INMEMORY_SIZE(預設值為0)控制,并且⼩⼤⼩必須為100MB。從Oracle Database 12.2開始,您可以通過ALTER SYSTEM指令将INMEMORY_SIZE參數增加⾄少128MB,來動态增加記憶體 區域的⼤⼩。請注意,⽆法動态縮⼩記憶體區域的⼤⼩。

In-Memory表在⾸次通路表資料或資料庫啟動時會擷取在IM列存儲中配置設定的IMCU。通過從磁盤格式轉換為新的記憶體列式格式,可以建立表的記憶體副本。每次執行個體重新啟動時都會完成此轉換,因為IM列存儲副本僅駐留在記憶體中。完成此轉換後,表 的記憶體版本逐漸可⽤于查詢。如果對表進⾏了部分轉換,則查詢能夠使⽤部分記憶體版本并轉到磁盤進⾏其餘操作,⽽不必等待整個表都被轉換。

為了響應查詢和資料操作語⾔ (DML),伺服器程序掃描列資料并更新SMU中繼資料。背景程序将磁盤中的⾏資料填充到IM列存儲中。In-Memory協調程序 (IMCO) 是啟動背景填充和重新填充列式資料的背景程序。空間管理協調程序 (SMCO) 和空間管理⼯作程序 (Wnnn) 是背景程序,它們代表IMCO實際填充和重新填充資料。DML塊更改将寫⼊緩沖區⾼速緩存,然後再寫⼊磁盤。然後,背景程序根據中繼資料失效和查詢請求将磁盤中的⾏資料重新填充到IM列存儲中。

您可以啟⽤ In-Memory 快速啟動功能,以将IM列存儲中的列資料以壓縮列格式寫回到資料庫中的表空間。此功能使資料庫啟動更快。請注意,此功能不适⽤于 IMEU,它們總是從IMCU動态填充。

注意:更多詳細資訊,請看如下内容:Introduction to Oracle Database In-Memory.

10、資料庫資料⽂件(Database Data Files)

Oracle Database 19c 技術架構(二)

資料庫是⼀組存儲⽤戶資料和中繼資料的實體⽂件。中繼資料由有關資料庫伺服器的結構,配置和控制資訊組成。您可以将資料庫設計為多租戶容器資料庫 (CDB) 或⾮容器資料庫 (non-CDB)(20c中隻⽀持多租戶結構)。

CDB由⼀個CDB根容器(也稱為根),唯⼀的⼀個種⼦可插⼊資料庫(種⼦ PDB),零個或多個⽤戶建立的可插拔資料庫(簡稱為PDB)以及零個或多個應⽤程式容器組成。整個CDB稱為系統容器。對于⽤戶或應⽤程式,PDB在邏輯上顯示為單 獨的資料庫。

CDB根容器名為CDB $ ROOT,包含多個資料⽂件,控制⽂件,重做⽇志⽂件, 閃回⽇志和歸檔的重做⽇志⽂件。資料⽂件存儲與所有PDB共享的Oracle提供的元數 據和普通⽤戶(每個容器中已知的⽤戶)。

種⼦PDB名為PDB $ SEED,是系統提供的PDB模闆,其中包含可⽤于建立新 PDB的多個資料⽂件。

正常PDB包含多個資料⽂件,這些⽂件包含⽀持應⽤程式所需的資料和代碼。例 如,⼈⼒資源應⽤程式。⽤戶僅與PDB互動,⽽不與種⼦PDB或根容器互動。您可以在CDB中建立多個PDB。多租戶體系結構的⽬标之⼀是每個PDB與應⽤程式具有⼀對 ⼀的關系。

應⽤程式容器是CDB中⽤于存儲應⽤程式資料的PDB的可選集合。建立應⽤程式 容器的⽬的是擁有獨⼀的主應⽤程式定義。CDB中可以有多個應⽤程式容器。

資料庫分為稱為表空間的邏輯存儲單元,這些邏輯存儲單元共同存儲所有資料庫 資料。每個表空間由⼀個或多個資料⽂件構成。根容器和正常PDB具有SYSTEM, SYSAUX,USERS,TEMP和UNDO表空間(在正常PDB中為可選)。種⼦PDB具有 SYSTEM,SYSAUX,TEMP和可選的UNDO表空間。

注意:更多詳細資訊,請看如下内容:Introduction to the Multitenant Architecture.

文章正在更新,敬請期待下文~

繼續閱讀