溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

oracle內(nèi)存架構(gòu)(二)

發(fā)布時(shí)間:2020-08-11 11:24:41 來源:網(wǎng)絡(luò) 閱讀:898 作者:墨筆軒 欄目:關(guān)系型數(shù)據(jù)庫

System Global Area (SGA)概述

SGA是一個(gè)可讀寫的內(nèi)存區(qū)域,它和oracle數(shù)據(jù)庫后臺(tái)進(jìn)程一起組成oracle數(shù)據(jù)庫實(shí)例。所有用戶進(jìn)程對(duì)應(yīng)的服務(wù)器進(jìn)程都可以在SGA中讀取信息。一些進(jìn)程會(huì)在數(shù)據(jù)庫操作期間對(duì)SGA區(qū)域進(jìn)行寫操作。

SGA有多種作用,如下所示:

·維護(hù)多個(gè)進(jìn)程和線程并發(fā)訪問的內(nèi)部數(shù)據(jù)結(jié)構(gòu)

·緩存來自磁盤的數(shù)據(jù)塊

·在重做日志寫入在線重做日志文件之前緩存重做日志

·存儲(chǔ)SQL執(zhí)行計(jì)劃

服務(wù)器進(jìn)程和后臺(tái)進(jìn)程并不駐留在SGA區(qū)域中,而是存在于一個(gè)單獨(dú)的內(nèi)存空間中。

每個(gè)數(shù)據(jù)庫實(shí)例都有它自己的SGA內(nèi)存區(qū)。當(dāng)實(shí)例啟動(dòng)時(shí)oracle數(shù)據(jù)庫會(huì)自動(dòng)為oracle實(shí)例分配SGA內(nèi)存區(qū),當(dāng)實(shí)例關(guān)閉時(shí)SGA內(nèi)存區(qū)也會(huì)被回收。

當(dāng)使用SQL*Plus或Oracle Enterprise Manager啟動(dòng)一個(gè)實(shí)例時(shí),SGA的大小會(huì)顯示出來,如下圖所示:

oracle內(nèi)存架構(gòu)(二)

如下圖所示,SGA由幾個(gè)內(nèi)存組件組成,這些組件是用于滿足特定需求所分配的內(nèi)存池。除了重做日志緩沖區(qū)外,所有SGA組件都在一個(gè)稱為顆粒的連續(xù)內(nèi)存單元中分配空間。顆粒大小是由總的SGA大小決定,SGA越大則顆粒就越大,SGA越小則顆粒就越小。

最主要的SGA組件如下所示:

·數(shù)據(jù)庫緩沖區(qū)(Database Buffer Cache

·內(nèi)存中的列存儲(chǔ)(In-Memory Column Store

·重做日志緩沖區(qū)(Redo Log Buffer

·共享池(Shared Pool

·大池(Large Pool

·Java池(Java Pool

·流池(Streams Pool

·固定SGA區(qū)(Fixed SGA

數(shù)據(jù)庫緩沖區(qū)(Database Buffer Cache)詳解

數(shù)據(jù)緩沖區(qū),也稱為緩沖區(qū),它是存儲(chǔ)從數(shù)據(jù)文件復(fù)制過來的數(shù)據(jù)塊的內(nèi)存區(qū)。

緩沖區(qū)是一個(gè)主存地址,其中緩沖管理器暫時(shí)緩存當(dāng)前或最近使用的數(shù)據(jù)塊。所有用戶并發(fā)連接到數(shù)據(jù)庫實(shí)例共享緩存區(qū)緩存。

數(shù)據(jù)庫緩沖區(qū)緩存的目的

oracle數(shù)據(jù)庫利用緩沖區(qū)緩存可以實(shí)現(xiàn)多個(gè)目標(biāo)

目的包括:

·優(yōu)化物理I/O

數(shù)據(jù)庫更新緩存中的數(shù)據(jù)塊,并存儲(chǔ)關(guān)于重做日志緩沖區(qū)中更改的元數(shù)據(jù)。提交后,數(shù)據(jù)庫將重做日志緩沖區(qū)的內(nèi)容寫入聯(lián)機(jī)重做日志文件但此時(shí)不會(huì)將數(shù)據(jù)塊寫入數(shù)據(jù)文件,數(shù)據(jù)塊隨后會(huì)被DBWn后臺(tái)進(jìn)程惰性寫入數(shù)據(jù)文件中。

·在緩沖區(qū)緩存中保留經(jīng)常被訪問的數(shù)據(jù)塊,并且將很少被訪問的數(shù)據(jù)塊寫入磁盤

當(dāng)啟用數(shù)據(jù)庫智能Flash緩存時(shí),緩沖區(qū)緩存的一部分可以駐留在Flash緩存中。這個(gè)緩沖區(qū)緩存擴(kuò)展存儲(chǔ)在一個(gè)或多個(gè)閃存設(shè)備上,它們是使用閃存的固態(tài)存儲(chǔ)設(shè)備。數(shù)據(jù)庫可以通過緩存緩沖來提高性能,而不是直接從磁盤上讀取數(shù)據(jù)。

使用DB_FLASH_CACHE_FILE和DB_FLASH_CACHE_SIZE初始化參數(shù)配置多個(gè)閃存設(shè)備。緩沖區(qū)緩存跟蹤每個(gè)設(shè)備,并統(tǒng)一向設(shè)備分發(fā)緩沖區(qū)。

數(shù)據(jù)庫智能Flash緩存只能在Solaris和Oracle Linux中使用。

緩沖狀態(tài)

數(shù)據(jù)庫使用內(nèi)部算法來管理緩存中的緩沖區(qū)。

緩沖區(qū)可以存在于以下任意一種互斥的狀態(tài)中:

·Unused狀態(tài)

緩沖區(qū)是可用的,因?yàn)樗鼜膩頉]有被使用過,或者是目前沒有被使用過。這種類型的緩沖區(qū)是數(shù)據(jù)庫中最容易被使用的。

·Clean狀態(tài)

這個(gè)緩沖區(qū)在之前已經(jīng)使用過了,現(xiàn)在包含了一個(gè)在時(shí)間節(jié)點(diǎn)上一個(gè)塊的可讀一致性版本,該塊包含數(shù)據(jù)但是它是“干凈”的,因此不需要檢查點(diǎn)。數(shù)據(jù)庫可以確定塊并重新利用它。

·Dirty狀態(tài)

緩沖區(qū)中包含修改過但是尚未寫入磁盤的數(shù)據(jù)。數(shù)據(jù)庫必須在重新使用前檢查塊。

每個(gè)緩沖區(qū)都有一個(gè)訪問模式:固定或自由(未固定)。緩沖區(qū)被“固定”在緩存中,這樣它就不會(huì)在用戶會(huì)話訪問內(nèi)存時(shí)耗盡內(nèi)存。多個(gè)會(huì)話不能同時(shí)修改一個(gè)固定的緩沖區(qū)。

緩沖模式

當(dāng)客戶機(jī)請(qǐng)求數(shù)據(jù)時(shí),oracle數(shù)據(jù)庫在當(dāng)前模式下或一致模式下從數(shù)據(jù)庫緩存中檢索緩沖區(qū)。

這些模式的不同之處如下所示:

·當(dāng)前模式

當(dāng)前模式是當(dāng)前在緩沖區(qū)緩存中出現(xiàn)的一個(gè)塊的檢索。例如:如果一個(gè)未提交的事務(wù)在一個(gè)塊中更新了兩行,那么當(dāng)前的模式就會(huì)用這些未提交的行來檢索塊。數(shù)據(jù)庫在修改語句中最常用的是db塊,它必須只更新塊的當(dāng)前版本。

·一致性模式

一個(gè)一致的讀get是對(duì)一個(gè)塊的讀一致性版本的檢索。這種檢索可用來撤銷數(shù)據(jù)。例如,如果一個(gè)未提交的事務(wù)在一個(gè)塊中更新了兩行,如果另一個(gè)單獨(dú)的會(huì)話中的一個(gè)查詢請(qǐng)求該塊,那么數(shù)據(jù)庫就會(huì)使用undo數(shù)據(jù)來創(chuàng)建這個(gè)塊(稱為一致的read克隆)的一個(gè)一致的版本,不包括未提交的更新。通常,查詢以一致模式檢索塊。

I/O緩沖區(qū)

邏輯I/O,也稱I/O緩沖區(qū),是指在緩沖區(qū)緩存中讀寫

當(dāng)在內(nèi)存中沒有找到請(qǐng)求的緩沖區(qū)時(shí),數(shù)據(jù)庫執(zhí)行物理I/O將緩沖區(qū)從閃存或磁盤復(fù)制到內(nèi)存中。然后,數(shù)據(jù)庫執(zhí)行一個(gè)邏輯I/O來讀取緩存的緩沖區(qū)。

Buffer更換算法

為了使緩沖區(qū)訪問效率更高,數(shù)據(jù)庫必須決定在內(nèi)存中緩存哪些緩沖區(qū),以及從磁盤訪問哪些緩沖區(qū)。

數(shù)據(jù)庫使用以下算法:

·LRU-based,block-level置換算法(塊級(jí))

這個(gè)復(fù)雜的算法在默認(rèn)情況下使用一個(gè)最近使用表(LRU),該表包含指向臟緩沖區(qū)和非臟緩沖區(qū)的指針。冷緩沖區(qū)是最近沒有被使用過的緩沖區(qū),熱緩沖區(qū)是經(jīng)常被訪問并且最近也在被使用的緩沖區(qū)。從理論上講只有一個(gè)最近使用表(LRU),但數(shù)據(jù)并發(fā)的角度來看,數(shù)據(jù)庫實(shí)際上使用了許多的最近使用表(LRU)。

Temperature-based,object-level 置換算法(對(duì)象級(jí))

從Oracle Database 12c Release 1(12.1.0.2)開始,自動(dòng)大表緩存功能允許表掃描在以下場(chǎng)景中使用不同的算法: 

  • Parallel queries(并行查詢): 在單實(shí)例和Oracle RAC集群數(shù)據(jù)庫中當(dāng)DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化參數(shù)設(shè)置為非零值時(shí),并行查詢可以使用大表緩存,而PARALLEL_DEGREE_POLICY則設(shè)置為自動(dòng)或自適應(yīng)。

  • Serial queries(串行查詢):在單實(shí)例配置中,當(dāng)DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化參數(shù)設(shè)置為非零值時(shí),串行查詢可以使用大表緩存。

當(dāng)一個(gè)表比內(nèi)存塊大時(shí),數(shù)據(jù)庫會(huì)根據(jù)訪問模式?jīng)Q定緩存哪些緩沖區(qū)。例如,如果只有95%的受歡迎的表適合于內(nèi)存,那么數(shù)據(jù)庫就可以選擇將剩下的5%的數(shù)據(jù)塊放在磁盤而不是周期性的讀取塊到內(nèi)存中并將塊寫入磁盤------這種情況被稱為抖動(dòng)現(xiàn)象。當(dāng)緩存多個(gè)大型對(duì)象時(shí),數(shù)據(jù)庫會(huì)考慮緩存更流行更熱的表而不是更冷的表,這將會(huì)影響到哪些數(shù)據(jù)塊會(huì)被緩存。DB_BIG_TABLE_CACHE_PERCENT_TARGET初始化參數(shù)設(shè)置了在這種算法下的緩沖區(qū)緩存的百分比。

Buffer Writes(緩沖區(qū)寫)

數(shù)據(jù)庫寫(DBW)進(jìn)程會(huì)定期將冷端數(shù)據(jù)和臟緩沖區(qū)數(shù)據(jù)寫入磁盤。

在下列情況下DBW將會(huì)觸發(fā)寫操作:

·服務(wù)器進(jìn)程無法找到干凈緩沖區(qū)來緩存數(shù)據(jù)塊。

當(dāng)緩沖區(qū)被弄臟時(shí),空閑緩沖區(qū)的數(shù)量就會(huì)減少。如果數(shù)字下降到一個(gè)閾值,此時(shí)又需要干凈緩沖區(qū),那么服務(wù)器進(jìn)程就會(huì)發(fā)出信號(hào)讓DBW進(jìn)程來工作。

·表空間被改變至只讀狀態(tài)或離線狀態(tài)。

·數(shù)據(jù)庫必須推進(jìn)在redo線程中檢查點(diǎn)的位置,實(shí)例恢復(fù)也必須從該檢查點(diǎn)開始。

Buffer Reads(緩沖區(qū)讀)

當(dāng)可利用的緩沖區(qū)數(shù)量很低時(shí),數(shù)據(jù)庫必須從緩沖區(qū)緩存中刪除緩沖區(qū)。

該算法取決于是否啟用了flash緩存:

·flash緩存不可用

數(shù)據(jù)庫在需要的時(shí)候會(huì)重新利用每個(gè)干凈緩沖區(qū),用新的數(shù)據(jù)塊覆蓋它。如果隨后需要被覆蓋掉的數(shù)據(jù)塊,數(shù)據(jù)庫必須再次從磁盤中讀取。

·flash緩存可用

DBW進(jìn)程可以將一個(gè)干凈的緩沖區(qū)的主體寫入閃存緩存,從而使其內(nèi)存緩沖區(qū)可以得到重用數(shù)據(jù)庫在內(nèi)存的LRU列表中保存了一個(gè)緩沖區(qū)頭,以跟蹤緩沖區(qū)主體在flash緩存中的狀態(tài)和位置。如果稍后需要此緩沖區(qū),則數(shù)據(jù)庫可以從閃存緩存中讀取數(shù)據(jù)而不是從磁盤讀取數(shù)據(jù)。

當(dāng)客戶端進(jìn)程請(qǐng)求緩沖區(qū)時(shí),服務(wù)器進(jìn)程將會(huì)搜索緩沖區(qū)的緩存。如果在內(nèi)存中找到緩沖區(qū),此時(shí)就會(huì)發(fā)生緩存命中。搜索的順序如下:

1、服務(wù)器進(jìn)程在整個(gè)緩沖區(qū)緩存中搜索緩沖區(qū)。如果服務(wù)器進(jìn)程找到了整個(gè)緩沖區(qū),數(shù)據(jù)庫就會(huì)執(zhí)行緩沖區(qū)的邏輯讀操作;

2、服務(wù)器進(jìn)程會(huì)在flash緩存LRU表中查找緩沖區(qū)頭。如果進(jìn)程找到緩沖區(qū)頭,那么數(shù)據(jù)庫將執(zhí)行一個(gè)物理讀操作將數(shù)據(jù)從閃存緩存讀到內(nèi)存緩存。

3、如果服務(wù)器進(jìn)程在內(nèi)存中找不到緩沖區(qū),此時(shí)服務(wù)器進(jìn)程會(huì)執(zhí)行以下操做:

    a、執(zhí)行一個(gè)物理I/O讀操作,將磁盤里的數(shù)據(jù)文件塊復(fù)制一份到內(nèi)存中

    b、到內(nèi)存中的緩沖區(qū)執(zhí)行邏輯讀操作

下圖演示了緩沖區(qū)搜索順序。擴(kuò)展緩沖區(qū)緩存包括內(nèi)存緩沖區(qū)緩存(包含整個(gè)緩沖區(qū))和flash緩存(包含緩沖體)。在圖中,數(shù)據(jù)庫在緩沖區(qū)緩存中搜索緩沖區(qū)但沒找到時(shí),它會(huì)將數(shù)據(jù)塊從磁盤讀入內(nèi)存。

oracle內(nèi)存架構(gòu)(二)

一般來說,通過cache hit 訪問數(shù)據(jù)比通過cache miss訪問數(shù)據(jù)要快。緩沖區(qū)緩存命中率度量數(shù)據(jù)庫在不需要從磁盤讀取數(shù)據(jù)的情況下,緩沖區(qū)緩存中找到被請(qǐng)求數(shù)據(jù)塊的頻率。

數(shù)據(jù)庫可以執(zhí)行來自數(shù)據(jù)文件或臨時(shí)文件的物理讀取。從數(shù)據(jù)文件讀取數(shù)據(jù)后遵循邏輯I/O。從臨時(shí)文件中讀取,當(dāng)內(nèi)存不足迫使數(shù)據(jù)庫將數(shù)據(jù)寫入臨時(shí)表并且隨后讀取數(shù)據(jù),此時(shí)就會(huì)產(chǎn)生一個(gè)臨時(shí)文件。這些物理讀取都會(huì)繞過緩沖區(qū)緩存,不產(chǎn)生邏輯I/O。

Buffer Touch Counts(緩沖區(qū)觸摸計(jì)數(shù))

數(shù)據(jù)庫會(huì)使用一個(gè)觸摸計(jì)數(shù)來測(cè)量LRU列表上的緩沖區(qū)訪問頻率。該機(jī)制使數(shù)據(jù)庫能夠在緩沖區(qū)被固定時(shí)增加計(jì)數(shù)器,而不是在LRU列表上不斷調(diào)整緩沖區(qū)。

數(shù)據(jù)庫不會(huì)物理地移動(dòng)內(nèi)存中數(shù)據(jù)塊的位置,移動(dòng)指的是改變指針在表中的位置。

當(dāng)緩沖區(qū)被固定的時(shí)候,數(shù)據(jù)庫會(huì)決定觸摸計(jì)數(shù)是不是上次增加的。如果計(jì)數(shù)值是3秒前增加的,那么計(jì)數(shù)值就會(huì)增加;否則計(jì)數(shù)值保持不變。這個(gè)3秒法則會(huì)防止緩沖區(qū)觸摸計(jì)數(shù)值爆發(fā)式增長。例如,一個(gè)會(huì)話可能會(huì)在一個(gè)數(shù)據(jù)塊中插入很多行,但是數(shù)據(jù)庫會(huì)將這些行看作一個(gè)觸摸值。

如果緩沖區(qū)在LRU的冷端,但是它的觸摸計(jì)數(shù)值很高,那么緩沖區(qū)就會(huì)被移動(dòng)到熱端。如果觸摸計(jì)數(shù)值較低,那么緩沖區(qū)就會(huì)被移出緩存。

Buffer Pools(緩沖池)

緩沖池是緩沖區(qū)的集合。

數(shù)據(jù)庫緩沖區(qū)緩存被劃分為一個(gè)或多個(gè)緩沖池,它們以相同的方式管理塊。緩沖池老化塊和緩沖塊的算法沒有本質(zhì)的區(qū)別。

你可以手動(dòng)配置單獨(dú)的緩沖池,這些緩沖池會(huì)將數(shù)據(jù)保存在緩沖區(qū)緩存中。也可以在使用完數(shù)據(jù)塊后立即為新數(shù)據(jù)塊指定可用的緩沖池。然后將特定的模式對(duì)象分配到適當(dāng)?shù)木彌_池,用來控制如何從緩存中使用塊。例如,可以將段劃分為熱、溫、冷的緩沖池。

緩沖池的類別如下:

·Default pool(默認(rèn)池)

這個(gè)池是數(shù)據(jù)塊通常被緩存的位置。除非手動(dòng)配置單獨(dú)的池,否則默認(rèn)池是唯一的緩沖池。其它池的可選配置對(duì)默認(rèn)池沒有影響。

自從oracle Database 12c Release 1(12.1.0.2)開始,大表緩存是默認(rèn)池的可選部分,它使用對(duì)象級(jí)基于熱度的替換算法。在單實(shí)例和oracle rac數(shù)據(jù)庫中,當(dāng)DB_BIG_TABLE_CACHE_PERCENT_TARGET的值不為零并且PARALLEL_DEGREE_POLICY設(shè)置為自動(dòng)時(shí)并行查詢可以使用大表緩存。在單實(shí)例配置中,當(dāng)DB_BIG_TABLE_CACHE_PERCENT_TARGET參數(shù)設(shè)置為非零值時(shí),串行查詢可以使用大表緩存。

·Keep Pool(保留池)

這個(gè)池是留給那些被訪問得很頻繁但是由于缺少空間不得不老化離開默認(rèn)池的塊。保留池的目的是在內(nèi)存中保留對(duì)象,從而避免I/O操作。

保留池管理緩沖區(qū)的方式與其它池相同:它不使用特殊的算法來固定緩沖區(qū)。“Keep”是一個(gè)命名約定。你可以放置那些你想保存在大的保留池中的表,你也可以放置那些你不想保留在小的循環(huán)池里的表。

·Recycle Pool(循環(huán)池)

這個(gè)池是為那些使用頻率很低的數(shù)據(jù)塊準(zhǔn)備的。循環(huán)池可以防止對(duì)象在緩存中消耗不必要的空間。

數(shù)據(jù)庫有標(biāo)準(zhǔn)塊大小。自己也可以創(chuàng)建一個(gè)與標(biāo)準(zhǔn)大小不同的塊大小的表空間。每個(gè)非默認(rèn)塊大小都有它自己的池。oracle數(shù)據(jù)庫管理這些池中的塊的方式與默認(rèn)池相同。

下圖展示了當(dāng)使用多個(gè)池時(shí)緩沖區(qū)緩存的結(jié)構(gòu)。緩存包含默認(rèn)池、保留池和循環(huán)池。默認(rèn)的塊大小是8KB。該緩存結(jié)構(gòu)包含了用于表空間的單獨(dú)的池,使用的非標(biāo)準(zhǔn)的塊大小為2Kb、4Kb和16Kb。

oracle內(nèi)存架構(gòu)(二)

緩沖區(qū)和全表掃描

數(shù)據(jù)庫使用一種復(fù)雜的算法來管理表掃描。默認(rèn)情況下,當(dāng)必須從磁盤讀取緩沖區(qū)時(shí),數(shù)據(jù)庫會(huì)將緩沖區(qū)插入到LRU列表的中間。這樣的話熱塊就可以留在緩存中,它們就不需要再次被從磁盤中讀取了。

如果進(jìn)行全表掃描,就需要將表中高水位下所有的行按順序讀取。假設(shè)表段中所有塊的總大小大于緩沖區(qū)緩存的大小。對(duì)該表的完整掃描可以清除所有的緩沖區(qū)緩存,這將會(huì)防止數(shù)據(jù)庫維護(hù)被頻繁訪問數(shù)據(jù)塊的緩存。

全表掃描的默認(rèn)模式

默認(rèn)情況下,數(shù)據(jù)庫采用保守的方法進(jìn)行全表掃描,只有當(dāng)表大小是緩沖區(qū)緩存的一小部分時(shí),才會(huì)將小表加載到內(nèi)存中。

為了確定中等大小的表是否應(yīng)該被緩存,數(shù)據(jù)庫使用了一種算法,它包含了和上次表掃描之間的時(shí)間間隔,緩沖區(qū)緩存的老化時(shí)間戳,以及緩沖區(qū)緩存中剩余的空間。

對(duì)于非常大的表,數(shù)據(jù)庫通常會(huì)使用直接讀取的方式,使大表繞過SGA直接加載進(jìn)PGA緩存中,從而避免占滿緩沖區(qū)緩存。對(duì)于中等大小的表,數(shù)據(jù)庫會(huì)采用直接讀取或緩存讀取的方式,如果決定使用緩存讀取的方式,數(shù)據(jù)庫會(huì)將數(shù)據(jù)塊放在LRU表的末尾,以防止掃描有效清除緩沖區(qū)緩存。

從Oracle Database 12c Release 1開始,數(shù)據(jù)庫實(shí)例的緩沖區(qū)緩存會(huì)自動(dòng)執(zhí)行內(nèi)部計(jì)算來確定SGA的內(nèi)存是否足夠緩存整個(gè)數(shù)據(jù)庫,如果緩存正在被訪問的表對(duì)性能有什么益處。如果整個(gè)數(shù)據(jù)庫大小小于內(nèi)存大小,并且滿足其他的內(nèi)部條件,那么數(shù)據(jù)庫就會(huì)把所有的表看作是小表,并且認(rèn)為它們可以被緩存,但是數(shù)據(jù)庫并不會(huì)緩存帶有NOCACHE標(biāo)記的LOBs。

Parallel Query Execution(并行查詢執(zhí)行)

在執(zhí)行全表掃描的過程中,數(shù)據(jù)庫有時(shí)可以通過執(zhí)行多個(gè)并行服務(wù)器進(jìn)程來提高響應(yīng)速度。

在某些情況下,當(dāng)數(shù)據(jù)庫有大量?jī)?nèi)存時(shí),數(shù)據(jù)可以在SGA中緩存并行查詢數(shù)據(jù)而不是通過直接路徑將數(shù)據(jù)讀入PGA中。通常情況下,由于潛在資源的使用,并行查詢會(huì)出現(xiàn)在低并發(fā)數(shù)據(jù)倉庫中。

CACHE Attribute(緩存屬性)

在不需要默認(rèn)緩存行為的情況下,可以使用ALTER TABLE ... CACHE來更改將大表中的塊讀取到數(shù)據(jù)庫緩沖區(qū)緩存的方式。

對(duì)于具有緩存屬性集的表,數(shù)據(jù)庫不強(qiáng)制將塊放入緩沖區(qū)緩存中。相反,數(shù)據(jù)庫會(huì)用和其它表塊相同的方式將塊從緩存中移出。執(zhí)行此操作時(shí)要小心,因?yàn)閷?duì)大表的全掃描可能會(huì)清除在緩存中的其它塊。

ps:執(zhí)行ALTER TABLE ... CACHE不會(huì)導(dǎo)致表被緩存。

KEEP Attribute(保留屬性)

對(duì)于大表,可以執(zhí)行ALTER TABLE ... STORAGE BUFFER_POOL KEEP掃描這些表的數(shù)據(jù)塊并將表加載進(jìn)保留池。

將一個(gè)表放置在保留池中,可以更改存儲(chǔ)塊緩沖區(qū)緩存的一部分,數(shù)據(jù)在默認(rèn)緩沖池中緩存它們。沒有單獨(dú)的算法控制保留池緩存。

Force Full Database Caching Mode(強(qiáng)制全數(shù)據(jù)庫緩存模式)

為了在某些情況下提高性能,可以執(zhí)行ALTER DATABASE ... FORCE FULL DATABASE CACHING語句來啟動(dòng)強(qiáng)制全數(shù)據(jù)庫緩存模式。

與默認(rèn)的自動(dòng)模式相比,強(qiáng)制全數(shù)據(jù)庫緩存模式認(rèn)為包括NOCACHE LOBs在內(nèi)的整個(gè)數(shù)據(jù)庫都可以在緩沖區(qū)中緩存。此模式自O(shè)racle Database 12c Release 1(12.1.0.2)開始。

啟動(dòng)全數(shù)據(jù)庫緩存模式并不會(huì)強(qiáng)迫數(shù)據(jù)庫進(jìn)入內(nèi)存。指的是整個(gè)數(shù)據(jù)庫都具備被完全緩存在緩沖區(qū)緩存的條件,oracle數(shù)據(jù)庫只在訪問它們時(shí)緩存這些表。

oracle建議,只有當(dāng)每個(gè)單獨(dú)實(shí)例的緩沖區(qū)緩存大小大于數(shù)據(jù)庫大小時(shí),才能啟用全數(shù)據(jù)庫緩存模式。這條準(zhǔn)則適用于單實(shí)例和oracle RAC數(shù)據(jù)庫。但是,當(dāng)oracle RAC應(yīng)用程序進(jìn)行良好分區(qū)并且所有實(shí)例的組合緩沖區(qū)(在實(shí)例間處理重復(fù)的緩存塊的區(qū)域)容量比數(shù)據(jù)庫大小更大時(shí),可以啟用全數(shù)據(jù)庫緩存模式。

In-Memory Column Store(內(nèi)存中的列存儲(chǔ))

從oracle 12c開始,內(nèi)存中的列存儲(chǔ)(IM列存儲(chǔ))是一個(gè)可選的靜態(tài)SGA池,它存儲(chǔ)了一個(gè)特殊的列格式的表和分區(qū)的副本,以進(jìn)行快速掃描。

IM列存儲(chǔ)并不能替代緩沖區(qū)緩存,而是作為一種補(bǔ)充,以便兩個(gè)內(nèi)存區(qū)域可以用不同的格式存儲(chǔ)相同的數(shù)據(jù)。默認(rèn)情況下,只有使用DDL指定為INMEMORY的數(shù)據(jù)對(duì)象才會(huì)被填充到IM列存儲(chǔ)中。

對(duì)于填充在IM列存儲(chǔ)的中的對(duì)象來說,不需要加載到數(shù)據(jù)庫緩沖區(qū)緩存中。

列格式只存在于內(nèi)存中。下圖顯示了存儲(chǔ)在IM列存儲(chǔ)中的sh模式的三個(gè)表:客戶、產(chǎn)品和銷售。IM列存儲(chǔ)通過列而不是通過行來存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)庫使柱狀數(shù)據(jù)與緩沖區(qū)緩存保持一致。

oracle內(nèi)存架構(gòu)(二)

IM Column Store的好處

IM列存儲(chǔ)支持?jǐn)?shù)據(jù)庫執(zhí)行掃描(scans)、連接(joins)和聚合(aggregates),比只使用on-disk模式要快的多。

通常IM列存儲(chǔ)在如下情況可以被用到:

·掃描大量行的查詢,并將使用諸如下列運(yùn)算符的篩選器:=,< >

·從表或物化視圖中選擇一個(gè)小的列的查詢,有大量的列,如從表中100列選擇5列的查詢

·將小的表連接到大表的查詢

·聚合類的查詢

業(yè)務(wù)應(yīng)用程序、特別的分析查詢和數(shù)據(jù)倉庫工作負(fù)載最受益。而使用索引查找執(zhí)行短事務(wù)的純粹的OLTP數(shù)據(jù)庫獲益則比較少。

IM柱狀存儲(chǔ)還有如下優(yōu)點(diǎn):

·支持現(xiàn)有的所有數(shù)據(jù)庫特性,包括高可用特性

·不需要更改應(yīng)用

優(yōu)化器會(huì)自動(dòng)利用列格式

·配置簡(jiǎn)單

INMEMORY_SIZE 初始化參數(shù)指定了在IM列存儲(chǔ)中保留的內(nèi)存數(shù)量。DDL語句可以指定要讀入IM列存儲(chǔ)的表空間、表、分區(qū)或列。

·壓縮優(yōu)化來提升查詢性能

這些壓縮技術(shù)使會(huì)話將更多的數(shù)據(jù)讀入內(nèi)存,從而提高了有效的內(nèi)存帶寬。

·需要更少的索引、物化視圖和OLAP多維數(shù)據(jù)集

預(yù)構(gòu)建對(duì)象數(shù)量的減少導(dǎo)致存儲(chǔ)空間的減少,使處理開銷明顯減少。

雙存儲(chǔ)器格式:列和行

當(dāng)獲取數(shù)據(jù)時(shí),oracle數(shù)據(jù)庫可以讀取IM列存儲(chǔ)或數(shù)據(jù)庫緩沖區(qū)緩存,或者是在同一個(gè)查詢中同時(shí)讀取列緩存和緩沖區(qū)緩存。

數(shù)據(jù)庫會(huì)將OLTP查詢(例如主鍵查找)發(fā)送到緩沖區(qū)緩存,并將解析和查詢報(bào)告發(fā)送到IM列存儲(chǔ)。因此,雙內(nèi)存格式是最好的選擇。

在執(zhí)行計(jì)劃中,“TABLE ACCESS IN MEMORY FULL”可以指定使用IM列存儲(chǔ)。

下圖顯示了一個(gè)示例IM列存儲(chǔ)。sales表以傳統(tǒng)的行格式存儲(chǔ)在磁盤上。SGA在IM列存儲(chǔ)中存儲(chǔ)柱狀格式的數(shù)據(jù),并在數(shù)據(jù)庫緩沖區(qū)緩存中以行格式存儲(chǔ)數(shù)據(jù)。

oracle內(nèi)存架構(gòu)(二)

IM列存儲(chǔ)支持每個(gè)永久的、有組織的表的on-disk數(shù)據(jù)格式。列格式不影響存儲(chǔ)在數(shù)據(jù)文件或緩沖區(qū)緩存中的數(shù)據(jù)格式,也不影響撤銷、聯(lián)機(jī)重做日志記錄等。

無論IM列存儲(chǔ)是否在使用,數(shù)據(jù)庫都會(huì)以相同的方式處理DML修改:通過更新緩沖區(qū)緩存、聯(lián)機(jī)重做日志文件、撤銷表空間等。數(shù)據(jù)庫會(huì)使用內(nèi)部機(jī)制跟蹤更改確保IM列存儲(chǔ)與數(shù)據(jù)庫的其余部分保持一致。例如,如果sales表駐留在IM列存儲(chǔ)中,此時(shí)sales表中的一行被更新,那么數(shù)據(jù)庫將自動(dòng)確保IM列存儲(chǔ)中的sales表的副本與事務(wù)保持一致。訪問IM列存儲(chǔ)庫的查詢結(jié)果總是返回同查詢緩沖區(qū)緩存相同的結(jié)果。

IM列填充

數(shù)據(jù)庫以行格式從磁盤讀取數(shù)據(jù),并將行轉(zhuǎn)到創(chuàng)建列,然后將數(shù)據(jù)壓縮到內(nèi)存壓縮單元(IMCUs)。

Wnnn進(jìn)程在IM列存儲(chǔ)中填充數(shù)據(jù)。每個(gè)worker進(jìn)程都在對(duì)象的數(shù)據(jù)塊的子集上操作。Population是一種流媒體機(jī)制,同時(shí)壓縮數(shù)據(jù)并將其轉(zhuǎn)換為柱狀格式。

INMEMORY_MAX_POPULATE_SERVERS初始化參數(shù)指定用于IM列存儲(chǔ)的worker進(jìn)程的最大數(shù)量。默認(rèn)情況下設(shè)置為cpu_count的一半。將此參數(shù)設(shè)置為系統(tǒng)環(huán)境下的最優(yōu)值。更多的worker進(jìn)程會(huì)讓population更快,但是會(huì)使用更多的CPU資源;更少的工作進(jìn)程導(dǎo)致了更慢的population,但是這樣會(huì)減少CPU開銷。

如果INMEMORY_MAX_POPULATE_SERVERS被設(shè)置為0,則population不可用。

實(shí)例啟動(dòng)時(shí),IM列存儲(chǔ)的population

每次數(shù)據(jù)庫實(shí)例啟動(dòng)時(shí),數(shù)據(jù)庫都必須從磁盤重新構(gòu)造完整的IM列格式。這個(gè)重構(gòu)是十分必要的,因?yàn)镮M列存儲(chǔ)只駐留在內(nèi)存中。

在響應(yīng)查詢時(shí),IM列存儲(chǔ)的population

在對(duì)象上設(shè)置IM屬性意味著該對(duì)象是IM列存儲(chǔ)中的一個(gè)候選對(duì)象,而不表示數(shù)據(jù)庫立即會(huì)將對(duì)象填充到內(nèi)存中。

默認(rèn)情況下(內(nèi)存優(yōu)先級(jí)設(shè)置為NONE),數(shù)據(jù)庫會(huì)推遲向IM列存儲(chǔ)中填充表,直到數(shù)據(jù)庫認(rèn)為該表有用。當(dāng)對(duì)象被設(shè)置IM屬性時(shí)且數(shù)據(jù)庫認(rèn)為內(nèi)存在其他地方有更好的用途,此時(shí)數(shù)據(jù)庫可能不會(huì)選擇將所有列填充到IM列存儲(chǔ)中。IM列存儲(chǔ)可以從表中填充列的子集。

下面是IM列存儲(chǔ)中對(duì)象的填充過程:

假設(shè)你作為管理員連接到數(shù)據(jù)庫。為了確定來自sh.customers表的數(shù)據(jù)是否被填充到IM列存儲(chǔ)中,可以執(zhí)行以下查詢:

oracle內(nèi)存架構(gòu)(二)

在本例中,由于表sh.customers此前未被訪問過,所以沒有在IM列存儲(chǔ)區(qū)中填充段。先查詢表sh.customers,然后再查詢V$IM_SEGMENTS:

oracle內(nèi)存架構(gòu)(二)

下面的查詢結(jié)果確認(rèn)了數(shù)據(jù)庫使用了IM列存儲(chǔ)來檢索結(jié)果:

oracle內(nèi)存架構(gòu)(二)

內(nèi)存中的柱狀壓縮

IM列存儲(chǔ)使用特殊的壓縮格式是針對(duì)訪問速度而不是減少存儲(chǔ)。

數(shù)據(jù)庫采用以下方式提高訪問速度:

·壓縮格式可以減少每列需要處理的內(nèi)存總量,SQL可以直接執(zhí)行在壓縮列上。

·數(shù)據(jù)庫使用SIMD向量指令在一個(gè)CPU時(shí)鐘周期中處理一組列值。在一個(gè)VECTOR上存儲(chǔ)很多值,可以最大的利用SIMD處理性能。

可以在CREATE和ALTER語句的子句中使用MEMCOMPRESS語句來選擇不同的壓縮比。

默認(rèn)的壓縮選項(xiàng)是MEMCOMPRESS FOR QUERY LOW。這個(gè)選項(xiàng)提供了最快的讀取速度,因?yàn)樵谶@個(gè)模式下數(shù)據(jù)庫不需要解壓縮數(shù)據(jù)。其它的壓縮選項(xiàng),如FOR QUERY HIGH和FOR CAPACITY模式會(huì)使用層壓縮,其中一些模式需要解壓縮。在使用IM列存儲(chǔ)存儲(chǔ)表之前可以使DBMS_COMPRESSION。GET_COMPRESSION_RATIO可以報(bào)告壓縮比,用它來估計(jì)需要用多少空間。 

IM列壓縮和混合列壓縮有點(diǎn)相近,都需要處理一組列。主要區(qū)別是,IM列存儲(chǔ)的列向量針對(duì)內(nèi)存存儲(chǔ)優(yōu)化過,而混合壓縮的列向量為磁盤存儲(chǔ)優(yōu)化過。

IM柱狀壓縮與混合柱狀壓縮密切相關(guān)。這兩種技術(shù)都涉及到對(duì)列向量的處理集。主要的區(qū)別在于IM列存儲(chǔ)的列向量是對(duì)于內(nèi)存存儲(chǔ)進(jìn)行了優(yōu)化,而混合式柱狀壓縮的列向量是對(duì)磁盤存儲(chǔ)進(jìn)行了優(yōu)化。

IM列存儲(chǔ)的掃描操作

列格式使得查詢只需要掃描需要的列。

例如:假設(shè)一個(gè)用戶執(zhí)行了如下ad、hoc查詢:

oracle內(nèi)存架構(gòu)(二)

當(dāng)使用緩沖區(qū)緩存時(shí),數(shù)據(jù)庫通常會(huì)掃描一個(gè)索引來查找產(chǎn)品ID,使用rowid將行從磁盤取出到緩沖區(qū)緩存,然后丟棄不需要的列值。在緩沖區(qū)緩存中以行格式掃描數(shù)據(jù)需要許多CPU指令,并且可能會(huì)導(dǎo)致CPU效率低下。

當(dāng)使用IM列存儲(chǔ)時(shí),數(shù)據(jù)庫只需要掃描請(qǐng)求的銷售列,從而避免使用昂貴的磁盤I/O。在列格式管道中掃描數(shù)據(jù)只需要CPU對(duì)必要的列進(jìn)行掃描從而可以提高效率。每個(gè)CPU核心使用SIMD向量指令掃描本地內(nèi)存列。

重做日志緩沖區(qū)

重做日志緩沖區(qū)是SGA中的一個(gè)循環(huán)緩沖區(qū),它用來存儲(chǔ)重做條目,描述對(duì)數(shù)據(jù)庫的更改。

重做記錄是一種數(shù)據(jù)結(jié)構(gòu),它包含了通過DML或DDL操作對(duì)數(shù)據(jù)庫進(jìn)行重構(gòu)或重做的必要信息。數(shù)據(jù)庫恢復(fù)就是用重做日志在數(shù)據(jù)文件中重構(gòu)丟失的更改。

數(shù)據(jù)庫會(huì)將重做記錄從用戶內(nèi)存空間復(fù)制到SGA中的重做日志緩沖區(qū)。重作記錄會(huì)在緩沖區(qū)中占據(jù)連續(xù)的空間。LGWR后臺(tái)日志寫進(jìn)程會(huì)將重做日志緩沖區(qū)的日志寫入磁盤上的活動(dòng)聯(lián)機(jī)重做日志組。下圖顯示了重做日志緩沖區(qū)的原理:

oracle內(nèi)存架構(gòu)(二)

LGWR將redo順序?qū)懙酱疟P上,而DBWn則將數(shù)據(jù)塊分散的寫到磁盤上。分散地寫往往會(huì)比順序?qū)懧枚?。由于LGWR進(jìn)程使用戶避免了等待DBWn完成它的慢寫操作,從而使數(shù)據(jù)庫具有更好的性能。

LOG_BUFFER初始化參數(shù)可以指定當(dāng)緩沖重做記錄時(shí)Oracle數(shù)據(jù)庫使用的內(nèi)存總量。與其它SGA組件不同,redo log buffer和fixed SGA buffer不會(huì)將內(nèi)存劃分為顆粒。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI