亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

oracle內存架構(二)

發布時間:2020-08-11 11:24:41 來源:網絡 閱讀:909 作者:墨筆軒 欄目:關系型數據庫

System Global Area (SGA)概述

SGA是一個可讀寫的內存區域,它和oracle數據庫后臺進程一起組成oracle數據庫實例。所有用戶進程對應的服務器進程都可以在SGA中讀取信息。一些進程會在數據庫操作期間對SGA區域進行寫操作。

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

·維護多個進程和線程并發訪問的內部數據結構

·緩存來自磁盤的數據塊

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

·存儲SQL執行計劃

服務器進程和后臺進程并不駐留在SGA區域中,而是存在于一個單獨的內存空間中。

每個數據庫實例都有它自己的SGA內存區。當實例啟動時oracle數據庫會自動為oracle實例分配SGA內存區,當實例關閉時SGA內存區也會被回收。

當使用SQL*Plus或Oracle Enterprise Manager啟動一個實例時,SGA的大小會顯示出來,如下圖所示:

oracle內存架構(二)

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

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

·數據庫緩沖區(Database Buffer Cache

·內存中的列存儲(In-Memory Column Store

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

·共享池(Shared Pool

·大池(Large Pool

·Java池(Java Pool

·流池(Streams Pool

·固定SGA區(Fixed SGA

數據庫緩沖區(Database Buffer Cache)詳解

數據緩沖區,也稱為緩沖區,它是存儲從數據文件復制過來的數據塊的內存區。

緩沖區是一個主存地址,其中緩沖管理器暫時緩存當前或最近使用的數據塊。所有用戶并發連接到數據庫實例共享緩存區緩存。

數據庫緩沖區緩存的目的

oracle數據庫利用緩沖區緩存可以實現多個目標

目的包括:

·優化物理I/O

數據庫更新緩存中的數據塊,并存儲關于重做日志緩沖區中更改的元數據。提交后,數據庫將重做日志緩沖區的內容寫入聯機重做日志文件但此時不會將數據塊寫入數據文件,數據塊隨后會被DBWn后臺進程惰性寫入數據文件中。

·在緩沖區緩存中保留經常被訪問的數據塊,并且將很少被訪問的數據塊寫入磁盤

當啟用數據庫智能Flash緩存時,緩沖區緩存的一部分可以駐留在Flash緩存中。這個緩沖區緩存擴展存儲在一個或多個閃存設備上,它們是使用閃存的固態存儲設備。數據庫可以通過緩存緩沖來提高性能,而不是直接從磁盤上讀取數據。

使用DB_FLASH_CACHE_FILE和DB_FLASH_CACHE_SIZE初始化參數配置多個閃存設備。緩沖區緩存跟蹤每個設備,并統一向設備分發緩沖區。

數據庫智能Flash緩存只能在Solaris和Oracle Linux中使用。

緩沖狀態

數據庫使用內部算法來管理緩存中的緩沖區。

緩沖區可以存在于以下任意一種互斥的狀態中:

·Unused狀態

緩沖區是可用的,因為它從來沒有被使用過,或者是目前沒有被使用過。這種類型的緩沖區是數據庫中最容易被使用的。

·Clean狀態

這個緩沖區在之前已經使用過了,現在包含了一個在時間節點上一個塊的可讀一致性版本,該塊包含數據但是它是“干凈”的,因此不需要檢查點。數據庫可以確定塊并重新利用它。

·Dirty狀態

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

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

緩沖模式

當客戶機請求數據時,oracle數據庫在當前模式下或一致模式下從數據庫緩存中檢索緩沖區。

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

·當前模式

當前模式是當前在緩沖區緩存中出現的一個塊的檢索。例如:如果一個未提交的事務在一個塊中更新了兩行,那么當前的模式就會用這些未提交的行來檢索塊。數據庫在修改語句中最常用的是db塊,它必須只更新塊的當前版本。

·一致性模式

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

I/O緩沖區

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

當在內存中沒有找到請求的緩沖區時,數據庫執行物理I/O將緩沖區從閃存或磁盤復制到內存中。然后,數據庫執行一個邏輯I/O來讀取緩存的緩沖區。

Buffer更換算法

為了使緩沖區訪問效率更高,數據庫必須決定在內存中緩存哪些緩沖區,以及從磁盤訪問哪些緩沖區。

數據庫使用以下算法:

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

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

Temperature-based,object-level 置換算法(對象級)

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

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

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

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

Buffer Writes(緩沖區寫)

數據庫寫(DBW)進程會定期將冷端數據和臟緩沖區數據寫入磁盤。

在下列情況下DBW將會觸發寫操作:

·服務器進程無法找到干凈緩沖區來緩存數據塊。

當緩沖區被弄臟時,空閑緩沖區的數量就會減少。如果數字下降到一個閾值,此時又需要干凈緩沖區,那么服務器進程就會發出信號讓DBW進程來工作。

·表空間被改變至只讀狀態或離線狀態。

·數據庫必須推進在redo線程中檢查點的位置,實例恢復也必須從該檢查點開始。

Buffer Reads(緩沖區讀)

當可利用的緩沖區數量很低時,數據庫必須從緩沖區緩存中刪除緩沖區。

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

·flash緩存不可用

數據庫在需要的時候會重新利用每個干凈緩沖區,用新的數據塊覆蓋它。如果隨后需要被覆蓋掉的數據塊,數據庫必須再次從磁盤中讀取。

·flash緩存可用

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

當客戶端進程請求緩沖區時,服務器進程將會搜索緩沖區的緩存。如果在內存中找到緩沖區,此時就會發生緩存命中。搜索的順序如下:

1、服務器進程在整個緩沖區緩存中搜索緩沖區。如果服務器進程找到了整個緩沖區,數據庫就會執行緩沖區的邏輯讀操作;

2、服務器進程會在flash緩存LRU表中查找緩沖區頭。如果進程找到緩沖區頭,那么數據庫將執行一個物理讀操作將數據從閃存緩存讀到內存緩存。

3、如果服務器進程在內存中找不到緩沖區,此時服務器進程會執行以下操做:

    a、執行一個物理I/O讀操作,將磁盤里的數據文件塊復制一份到內存中

    b、到內存中的緩沖區執行邏輯讀操作

下圖演示了緩沖區搜索順序。擴展緩沖區緩存包括內存緩沖區緩存(包含整個緩沖區)和flash緩存(包含緩沖體)。在圖中,數據庫在緩沖區緩存中搜索緩沖區但沒找到時,它會將數據塊從磁盤讀入內存。

oracle內存架構(二)

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

數據庫可以執行來自數據文件或臨時文件的物理讀取。從數據文件讀取數據后遵循邏輯I/O。從臨時文件中讀取,當內存不足迫使數據庫將數據寫入臨時表并且隨后讀取數據,此時就會產生一個臨時文件。這些物理讀取都會繞過緩沖區緩存,不產生邏輯I/O。

Buffer Touch Counts(緩沖區觸摸計數)

數據庫會使用一個觸摸計數來測量LRU列表上的緩沖區訪問頻率。該機制使數據庫能夠在緩沖區被固定時增加計數器,而不是在LRU列表上不斷調整緩沖區。

數據庫不會物理地移動內存中數據塊的位置,移動指的是改變指針在表中的位置。

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

如果緩沖區在LRU的冷端,但是它的觸摸計數值很高,那么緩沖區就會被移動到熱端。如果觸摸計數值較低,那么緩沖區就會被移出緩存。

Buffer Pools(緩沖池)

緩沖池是緩沖區的集合。

數據庫緩沖區緩存被劃分為一個或多個緩沖池,它們以相同的方式管理塊。緩沖池老化塊和緩沖塊的算法沒有本質的區別。

你可以手動配置單獨的緩沖池,這些緩沖池會將數據保存在緩沖區緩存中。也可以在使用完數據塊后立即為新數據塊指定可用的緩沖池。然后將特定的模式對象分配到適當的緩沖池,用來控制如何從緩存中使用塊。例如,可以將段劃分為熱、溫、冷的緩沖池。

緩沖池的類別如下:

·Default pool(默認池)

這個池是數據塊通常被緩存的位置。除非手動配置單獨的池,否則默認池是唯一的緩沖池。其它池的可選配置對默認池沒有影響。

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

·Keep Pool(保留池)

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

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

·Recycle Pool(循環池)

這個池是為那些使用頻率很低的數據塊準備的。循環池可以防止對象在緩存中消耗不必要的空間。

數據庫有標準塊大小。自己也可以創建一個與標準大小不同的塊大小的表空間。每個非默認塊大小都有它自己的池。oracle數據庫管理這些池中的塊的方式與默認池相同。

下圖展示了當使用多個池時緩沖區緩存的結構。緩存包含默認池、保留池和循環池。默認的塊大小是8KB。該緩存結構包含了用于表空間的單獨的池,使用的非標準的塊大小為2Kb、4Kb和16Kb。

oracle內存架構(二)

緩沖區和全表掃描

數據庫使用一種復雜的算法來管理表掃描。默認情況下,當必須從磁盤讀取緩沖區時,數據庫會將緩沖區插入到LRU列表的中間。這樣的話熱塊就可以留在緩存中,它們就不需要再次被從磁盤中讀取了。

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

全表掃描的默認模式

默認情況下,數據庫采用保守的方法進行全表掃描,只有當表大小是緩沖區緩存的一小部分時,才會將小表加載到內存中。

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

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

從Oracle Database 12c Release 1開始,數據庫實例的緩沖區緩存會自動執行內部計算來確定SGA的內存是否足夠緩存整個數據庫,如果緩存正在被訪問的表對性能有什么益處。如果整個數據庫大小小于內存大小,并且滿足其他的內部條件,那么數據庫就會把所有的表看作是小表,并且認為它們可以被緩存,但是數據庫并不會緩存帶有NOCACHE標記的LOBs。

Parallel Query Execution(并行查詢執行)

在執行全表掃描的過程中,數據庫有時可以通過執行多個并行服務器進程來提高響應速度。

在某些情況下,當數據庫有大量內存時,數據可以在SGA中緩存并行查詢數據而不是通過直接路徑將數據讀入PGA中。通常情況下,由于潛在資源的使用,并行查詢會出現在低并發數據倉庫中。

CACHE Attribute(緩存屬性)

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

對于具有緩存屬性集的表,數據庫不強制將塊放入緩沖區緩存中。相反,數據庫會用和其它表塊相同的方式將塊從緩存中移出。執行此操作時要小心,因為對大表的全掃描可能會清除在緩存中的其它塊。

ps:執行ALTER TABLE ... CACHE不會導致表被緩存。

KEEP Attribute(保留屬性)

對于大表,可以執行ALTER TABLE ... STORAGE BUFFER_POOL KEEP掃描這些表的數據塊并將表加載進保留池。

將一個表放置在保留池中,可以更改存儲塊緩沖區緩存的一部分,數據在默認緩沖池中緩存它們。沒有單獨的算法控制保留池緩存。

Force Full Database Caching Mode(強制全數據庫緩存模式)

為了在某些情況下提高性能,可以執行ALTER DATABASE ... FORCE FULL DATABASE CACHING語句來啟動強制全數據庫緩存模式。

與默認的自動模式相比,強制全數據庫緩存模式認為包括NOCACHE LOBs在內的整個數據庫都可以在緩沖區中緩存。此模式自Oracle Database 12c Release 1(12.1.0.2)開始。

啟動全數據庫緩存模式并不會強迫數據庫進入內存。指的是整個數據庫都具備被完全緩存在緩沖區緩存的條件,oracle數據庫只在訪問它們時緩存這些表。

oracle建議,只有當每個單獨實例的緩沖區緩存大小大于數據庫大小時,才能啟用全數據庫緩存模式。這條準則適用于單實例和oracle RAC數據庫。但是,當oracle RAC應用程序進行良好分區并且所有實例的組合緩沖區(在實例間處理重復的緩存塊的區域)容量比數據庫大小更大時,可以啟用全數據庫緩存模式。

In-Memory Column Store(內存中的列存儲)

從oracle 12c開始,內存中的列存儲(IM列存儲)是一個可選的靜態SGA池,它存儲了一個特殊的列格式的表和分區的副本,以進行快速掃描。

IM列存儲并不能替代緩沖區緩存,而是作為一種補充,以便兩個內存區域可以用不同的格式存儲相同的數據。默認情況下,只有使用DDL指定為INMEMORY的數據對象才會被填充到IM列存儲中。

對于填充在IM列存儲的中的對象來說,不需要加載到數據庫緩沖區緩存中。

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

oracle內存架構(二)

IM Column Store的好處

IM列存儲支持數據庫執行掃描(scans)、連接(joins)和聚合(aggregates),比只使用on-disk模式要快的多。

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

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

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

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

·聚合類的查詢

業務應用程序、特別的分析查詢和數據倉庫工作負載最受益。而使用索引查找執行短事務的純粹的OLTP數據庫獲益則比較少。

IM柱狀存儲還有如下優點:

·支持現有的所有數據庫特性,包括高可用特性

·不需要更改應用

優化器會自動利用列格式

·配置簡單

INMEMORY_SIZE 初始化參數指定了在IM列存儲中保留的內存數量。DDL語句可以指定要讀入IM列存儲的表空間、表、分區或列

·壓縮優化來提升查詢性能

這些壓縮技術使會話將更多的數據讀入內存,從而提高了有效的內存帶寬。

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

預構建對象數量的減少導致存儲空間的減少,使處理開銷明顯減少。

雙存儲器格式:列和行

當獲取數據時,oracle數據庫可以讀取IM列存儲或數據庫緩沖區緩存,或者是在同一個查詢中同時讀取列緩存和緩沖區緩存。

數據庫會將OLTP查詢(例如主鍵查找)發送到緩沖區緩存,并將解析和查詢報告發送到IM列存儲。因此,雙內存格式是最好的選擇。

在執行計劃中,“TABLE ACCESS IN MEMORY FULL”可以指定使用IM列存儲。

下圖顯示了一個示例IM列存儲。sales表以傳統的行格式存儲在磁盤上。SGA在IM列存儲中存儲柱狀格式的數據,并在數據庫緩沖區緩存中以行格式存儲數據。

oracle內存架構(二)

IM列存儲支持每個永久的、有組織的表的on-disk數據格式。列格式不影響存儲在數據文件或緩沖區緩存中的數據格式,也不影響撤銷、聯機重做日志記錄等。

無論IM列存儲是否在使用,數據庫都會以相同的方式處理DML修改:通過更新緩沖區緩存、聯機重做日志文件、撤銷表空間等。數據庫會使用內部機制跟蹤更改確保IM列存儲與數據庫的其余部分保持一致。例如,如果sales表駐留在IM列存儲中,此時sales表中的一行被更新,那么數據庫將自動確保IM列存儲中的sales表的副本與事務保持一致。訪問IM列存儲庫的查詢結果總是返回同查詢緩沖區緩存相同的結果。

IM列填充

數據庫以行格式從磁盤讀取數據,并將行轉到創建列,然后將數據壓縮到內存壓縮單元(IMCUs)。

Wnnn進程在IM列存儲中填充數據。每個worker進程都在對象的數據塊的子集上操作。Population是一種流媒體機制,同時壓縮數據并將其轉換為柱狀格式。

INMEMORY_MAX_POPULATE_SERVERS初始化參數指定用于IM列存儲的worker進程的最大數量。默認情況下設置為cpu_count的一半。將此參數設置為系統環境下的最優值。更多的worker進程會讓population更快,但是會使用更多的CPU資源;更少的工作進程導致了更慢的population,但是這樣會減少CPU開銷。

如果INMEMORY_MAX_POPULATE_SERVERS被設置為0,則population不可用。

實例啟動時,IM列存儲的population

每次數據庫實例啟動時,數據庫都必須從磁盤重新構造完整的IM列格式。這個重構是十分必要的,因為IM列存儲只駐留在內存中。

在響應查詢時,IM列存儲的population

在對象上設置IM屬性意味著該對象是IM列存儲中的一個候選對象,而不表示數據庫立即會將對象填充到內存中。

默認情況下(內存優先級設置為NONE),數據庫會推遲向IM列存儲中填充表,直到數據庫認為該表有用。當對象被設置IM屬性時且數據庫認為內存在其他地方有更好的用途,此時數據庫可能不會選擇將所有列填充到IM列存儲中。IM列存儲可以從表中填充列的子集。

下面是IM列存儲中對象的填充過程:

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

oracle內存架構(二)

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

oracle內存架構(二)

下面的查詢結果確認了數據庫使用了IM列存儲來檢索結果:

oracle內存架構(二)

內存中的柱狀壓縮

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

數據庫采用以下方式提高訪問速度:

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

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

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

默認的壓縮選項是MEMCOMPRESS FOR QUERY LOW。這個選項提供了最快的讀取速度,因為在這個模式下數據庫不需要解壓縮數據。其它的壓縮選項,如FOR QUERY HIGH和FOR CAPACITY模式會使用層壓縮,其中一些模式需要解壓縮。在使用IM列存儲存儲表之前可以使DBMS_COMPRESSION。GET_COMPRESSION_RATIO可以報告壓縮比,用它來估計需要用多少空間。 

IM列壓縮和混合列壓縮有點相近,都需要處理一組列。主要區別是,IM列存儲的列向量針對內存存儲優化過,而混合壓縮的列向量為磁盤存儲優化過。

IM柱狀壓縮與混合柱狀壓縮密切相關。這兩種技術都涉及到對列向量的處理集。主要的區別在于IM列存儲的列向量是對于內存存儲進行了優化,而混合式柱狀壓縮的列向量是對磁盤存儲進行了優化。

IM列存儲的掃描操作

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

例如:假設一個用戶執行了如下ad、hoc查詢:

oracle內存架構(二)

當使用緩沖區緩存時,數據庫通常會掃描一個索引來查找產品ID,使用rowid將行從磁盤取出到緩沖區緩存,然后丟棄不需要的列值。在緩沖區緩存中以行格式掃描數據需要許多CPU指令,并且可能會導致CPU效率低下。

當使用IM列存儲時,數據庫只需要掃描請求的銷售列,從而避免使用昂貴的磁盤I/O。在列格式管道中掃描數據只需要CPU對必要的列進行掃描從而可以提高效率。每個CPU核心使用SIMD向量指令掃描本地內存列。

重做日志緩沖區

重做日志緩沖區是SGA中的一個循環緩沖區,它用來存儲重做條目,描述對數據庫的更改。

重做記錄是一種數據結構,它包含了通過DML或DDL操作對數據庫進行重構或重做的必要信息。數據庫恢復就是用重做日志在數據文件中重構丟失的更改。

數據庫會將重做記錄從用戶內存空間復制到SGA中的重做日志緩沖區。重作記錄會在緩沖區中占據連續的空間。LGWR后臺日志寫進程會將重做日志緩沖區的日志寫入磁盤上的活動聯機重做日志組。下圖顯示了重做日志緩沖區的原理:

oracle內存架構(二)

LGWR將redo順序寫到磁盤上,而DBWn則將數據塊分散的寫到磁盤上。分散地寫往往會比順序寫慢得多。由于LGWR進程使用戶避免了等待DBWn完成它的慢寫操作,從而使數據庫具有更好的性能。

LOG_BUFFER初始化參數可以指定當緩沖重做記錄時Oracle數據庫使用的內存總量。與其它SGA組件不同,redo log buffer和fixed SGA buffer不會將內存劃分為顆粒。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荣昌县| 利津县| 海伦市| 崇明县| 郧西县| 西峡县| 呼玛县| 林口县| 丰原市| 彝良县| 电白县| 饶阳县| 安康市| 平邑县| 泾阳县| 泰来县| 竹北市| 辽源市| 上林县| 斗六市| 易门县| 彩票| 嘉兴市| 团风县| 朔州市| 潜山县| 兴宁市| 洞口县| 定安县| 买车| 化德县| 屏南县| 乌兰察布市| 息烽县| 开平市| 鞍山市| 亚东县| 海南省| 平陆县| 平罗县| 闸北区|