溫馨提示×

溫馨提示×

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

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

oracle 12c 列式存儲 ( In Memory 理論)

發(fā)布時間:2020-08-11 11:57:40 來源:ITPUB博客 閱讀:227 作者:pentium 欄目:關(guān)系型數(shù)據(jù)庫

隨著Oracle 12c推出了in memory組件,使得Oracle數(shù)據(jù)庫具有了雙模式數(shù)據(jù)存放方式,從而能夠?qū)崿F(xiàn)對混合類型應(yīng)用的支持:傳統(tǒng)的以行形式保存的數(shù)據(jù)滿足OLTP應(yīng)用;列形式保存的數(shù)據(jù)滿足以查詢?yōu)橹鞯腛LAP應(yīng)用。in memory組件可以和其他數(shù)據(jù)庫組件功能使用,并不需要用戶單獨開發(fā)或者修改應(yīng)用程序,就可以非常方便的實現(xiàn)基于實時數(shù)據(jù)庫分析的轉(zhuǎn)變。本文會介紹in memory組件的一些相關(guān)知識,包含了以下的內(nèi)容:

-列式存儲的基本知識 
-訪問in memory area中的數(shù)據(jù) 
-In memory和RAC的融合

1.列式存儲的基本知識。

1.1內(nèi)存結(jié)構(gòu)

傳統(tǒng)的數(shù)據(jù)庫采用的是行式存儲,當(dāng)一個事務(wù)發(fā)生時,oracle會對一行(或多行)數(shù)據(jù)進(jìn)行操作,也就是說數(shù)據(jù)的操作單位是一行數(shù)據(jù),即使可能需要被訪問的數(shù)據(jù)只是其中的幾個列,這種數(shù)據(jù)保存方式對以DML為主的OLTP應(yīng)用是非常適合,也是非常高效的。但是在OLAP系統(tǒng)當(dāng)中,針對大量數(shù)據(jù)的查詢操作是占絕對地位的,而這些查詢往往只針對表中一些特定的列。另外,數(shù)據(jù)的改變都是以數(shù)據(jù)裝載的方式發(fā)生的,也就是說數(shù)據(jù)被裝載到數(shù)據(jù)庫后是極少發(fā)生改變的,毫無疑問以列的方式組織數(shù)據(jù)無疑是更好的選擇。正是因為這兩種存放數(shù)據(jù)的方式各有利弊,無論以哪一種方式來保存數(shù)據(jù)都無法很好的滿足混合式應(yīng)用的數(shù)據(jù)庫系統(tǒng)的要求,Oracle推出了所謂的雙模式數(shù)據(jù)存放方式:在磁盤(也就是數(shù)據(jù)文件)和database buffer cache中以行的形式存放數(shù)據(jù);單獨開辟一塊內(nèi)存空間(in memory area),其中以列的方式保存數(shù)據(jù),滿足OLAP類型的查詢需求。而Oracle之所以選擇單獨開辟一塊內(nèi)存來保存列模式數(shù)據(jù)的主要原因之一就是OLAP的應(yīng)用是以查詢?yōu)橹鞯?,而且?shù)據(jù)改變的發(fā)生方式絕大部分都是以數(shù)據(jù)加載的方式發(fā)生的,這意味著oracle完全也通過批量數(shù)據(jù)加載的方式來完成in memory area空間中的數(shù)據(jù)加載從而保證數(shù)據(jù)的實時性。接下來,從in memory area內(nèi)存結(jié)構(gòu),數(shù)據(jù)加載過程兩個方面來介紹in memory組件的一些基本知識。

首先,in memory area是獨立于傳統(tǒng)的SGA和PGA的單獨的內(nèi)存空間,由1Mpool和64Kpool兩部分構(gòu)成。其中1M pool用于保存列格式的數(shù)據(jù),IMCU(in memoryCompressionUnit)是基本的存儲單位;64Kpool用于保存和IMCU相對的元數(shù)據(jù)信息,SMU(SnapshotMetadataUnit)是這部分內(nèi)存的基本單位。讀者可以通過下面的查詢了解相關(guān)的信息。 
oracle 12c 列式存儲 ( In Memory 理論)

IMCU是用于在內(nèi)存中保存列格式數(shù)據(jù)的基本存儲單位,oracle會盡量保證每個IMCU的大小為1M,每個IMCU由圖1所示的兩部分構(gòu)成

oracle 12c 列式存儲 ( In Memory 理論)

圖1

 

 

SMU部分主要用于保存IMCU的原數(shù)據(jù)信息,例如:IMCU對應(yīng)的指針,IMCU包含的extent范圍,DBA范圍,Journaltable的指針,Rowid位圖等。

1.2數(shù)據(jù)加載(populate)

在了解了in memory如何在內(nèi)存中保存數(shù)據(jù)之后,再來看一下數(shù)據(jù)是如何被加載到內(nèi)存中的。根據(jù)之前內(nèi)容的介紹,數(shù)據(jù)在數(shù)據(jù)文件中是以行格式來保存的,那么就需要一種機(jī)制來把數(shù)據(jù)加載到in memory area當(dāng)中,并且在加載過程當(dāng)中完成從行模式到列模式的轉(zhuǎn)變。

首先,oracle支持對表,分區(qū)或表空間指定in memory屬性,也就是說in memory屬性是針對物理數(shù)據(jù)庫對象的,而不是邏輯數(shù)據(jù)庫對象的。例如:我們可以使用下面的語句來為數(shù)據(jù)庫對象指定in memory屬性:

SQL>alter table sales inmemory no memcompress priority critical; 
SQL>ALTER TABLESPACE ts_data INMEMORY; 
SQL>ALTER TABLE sales MODIFY PARTITION SALES_201501 INMEMORY;

需要說明的是,由于in memory組件主要是針對OLAP應(yīng)用的,而這種應(yīng)用絕大部分的操作都是查詢,而且很多時候只關(guān)心表中特定的一個或多個列,所以in memory特性還可以指定只把表中的特定的一個或多個列加載到in memory area當(dāng)中。

由于in memory area區(qū)域的大小是有限的,主機(jī)的內(nèi)存資源也是有限的,而數(shù)據(jù)庫的容量往往會超過已有的內(nèi)存資源,所以O(shè)racle建議將性能要求很高的表裝載到in memory area當(dāng)中,而將性能要求比較低的表保存到閃存或者磁盤上。當(dāng)然,如果內(nèi)存資源充足,而且數(shù)據(jù)庫不大,大部分的應(yīng)用是以查詢?yōu)橹?,也可以考慮將所有的表都裝載到in memory區(qū)域中。另外,也正是由于資源的限制,Oracle允許用戶為不同的表設(shè)置in memory加載優(yōu)先級,基本的原則是優(yōu)先級高的對象被首先加載到in memory區(qū)域當(dāng)中,優(yōu)先級低的對象需要等到高優(yōu)先級的對象加載完畢之后才能夠被加載。Oracle提供了5種in memory加載優(yōu)先級,表1包含了每種優(yōu)先級的詳細(xì)信息。 
oracle 12c 列式存儲 ( In Memory 理論)

表1

 

另外,由于in memory主要是面向查詢?yōu)橹鞯腛LAP或者決策支持系統(tǒng),也就是說絕大部分的數(shù)據(jù)再被裝載(Load)到數(shù)據(jù)庫之后就不會再改變了,那么在加載數(shù)據(jù)的同時對數(shù)據(jù)進(jìn)行壓縮無疑可以節(jié)省內(nèi)存空間,而且還能夠提高查詢的效率(主要的原因是很多被查詢的列會包含大量的重復(fù)值)。所以in memory組件提供了豐富的壓縮選項,允許用戶在為對象指定in memory選項的同時指定壓縮方法。表2列出了支持的壓縮級別:

oracle 12c 列式存儲 ( In Memory 理論)

上表中的壓縮比率由上至下,越來越高。以下的sql語句說明在將表salse加載到in memory area時的優(yōu)先級最高,而且需要使用“memcompress for query”方式進(jìn)行壓縮:SQL>alter table sales inmemory memcompress for query low priority critical; 
如果需要在指定壓縮選項之前了解每種壓縮選項能夠獲得的壓縮比,可以使用Oracle Compression Advisor(DBMS_COMPRESSION包)來進(jìn)行估算。

最后,加載過程是通過后臺進(jìn)程IMCO和工作進(jìn)程(W00)進(jìn)程來協(xié)同實現(xiàn)的,在數(shù)據(jù)庫啟動后或者一些對象的in memory選項被啟用后,IMCO進(jìn)程會創(chuàng)建出一些加載任務(wù),并根據(jù)需要分配給若干個工作進(jìn)程,每個工作進(jìn)程負(fù)責(zé)一部分?jǐn)?shù)據(jù)的加載工作,當(dāng)所有工作進(jìn)程完成了對應(yīng)部分?jǐn)?shù)據(jù)的加載之后,通知IMCO進(jìn)程加載完成。

2.In memory的數(shù)據(jù)一致性

如果我們的數(shù)據(jù)庫是只讀的,那么事情就變得簡單多了,因為數(shù)據(jù)就不會存在一致性問題,但是事實并非如此,對于大部分的數(shù)據(jù)庫,事務(wù)處理是一直都會發(fā)生的,那么數(shù)據(jù)的一致性就需要得到保證。對于in memory組件也不例外,如果DML語句修改的數(shù)據(jù)并沒有被加載到in memory區(qū)域當(dāng)中,那么DML語句的修改就僅限于SGA當(dāng)中;反之如果修改的數(shù)據(jù)已經(jīng)被加載到了in memory區(qū)域中,那么就需要一種機(jī)制來確保數(shù)據(jù)的一致性。例如:沒有被提交的數(shù)據(jù)不能被看到,而執(zhí)行改變的會話應(yīng)該能看到最新的數(shù)據(jù)。

Oracle 是通過journal table 的方式來確保數(shù)據(jù)的一致性的。每個IMCU都會對應(yīng)一個自己的journal table, 如果DML語句修改的數(shù)據(jù)包含在IMCU當(dāng)中,就在journal table 當(dāng)中把修改后的數(shù)據(jù)記錄下來,我們稱之為private journal;當(dāng)事務(wù)提交之后,再把journal table當(dāng)中對應(yīng)的記錄標(biāo)識成為shared journal。這樣就可以保證查詢在訪問IMCU時能夠獲得一致的數(shù)據(jù),而如果查詢需要的數(shù)據(jù)在journal table 中也無法找到時,oracle 會自動根據(jù)IMCU中記錄的Rowid 位圖中的信息映射到buffer cache 當(dāng)中相應(yīng)的位置來找到滿足查詢要求的數(shù)據(jù)。圖2描述了journal table和IMCU的基本關(guān)系。

oracle 12c 列式存儲 ( In Memory 理論)

圖2

 

然而,如果DML 語句不斷發(fā)生的話,就會使journal table 中的數(shù)據(jù)越來越多,甚至出現(xiàn)IMCU中大部分的數(shù)據(jù)都是舊數(shù)據(jù),而新數(shù)據(jù)都保存在journal table中的情況,這對于in memory查詢的性能傷害是很大的。所以,Oracle定義了一個閥值(threshold),當(dāng)IMCU中舊數(shù)據(jù)的比例達(dá)到這個閥值時就會觸發(fā)重新加載的過程,也就是說,IMCO后臺進(jìn)程會每隔一段時間(默認(rèn)2分鐘)檢查一次是否有IMCU 滿足重新加載的條件,如果發(fā)現(xiàn)了滿足條件的IMCU,就會通知W00工作進(jìn)程對相應(yīng)的IMCU進(jìn)行重新加載,但是由于重新加載的成本是比較高的,而且可能會影響一些正在運(yùn)行的語句,所以O(shè)racle 會采用漸進(jìn)的方式來對IMCU進(jìn)行重新加載的操作,也就是每次只選擇一部分滿足重新加載條件的IMCU進(jìn)行處理,而具體的程度可以通過INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT參數(shù)來進(jìn)行調(diào)整。

對于事務(wù)所產(chǎn)生的journal table對系統(tǒng)產(chǎn)生的額外負(fù)載到底有多大,這個是很難進(jìn)行量化的,因為有太多的因素會對它產(chǎn)生影響,例如加載時采用的壓縮方法,改變的方式,應(yīng)用程序訪問數(shù)據(jù)的行為。但是,仍然有一些基本的原則是可以盡量減少數(shù)據(jù)改變對in memory 產(chǎn)生的影響的。由于數(shù)據(jù)再被加載到in memory area時是以extent 為單位的,如果對數(shù)據(jù)的改變是隨機(jī)分布到表的各個extent的話,重新加載的成本就會很高,因為這意味著大量的IMCU需要被重新構(gòu)建;而如果數(shù)據(jù)的改變能夠集中到特定范圍的extent中,或者大部分的改變都是數(shù)據(jù)插入而且使用直接路徑加載的話,那么重新加載的成本就會被大大降低。另外的建議就是對盡量使用分區(qū)表來保存數(shù)據(jù),這樣有利于將數(shù)據(jù)的改變限定到特定的分區(qū)當(dāng)中,而且針對這些分區(qū)不使用或者盡量使用 DML,MEMORYCOMPRESS FOR DML這些輕量級的壓縮方式。

3.訪問in memory area中的數(shù)據(jù)

3.1單表訪問

在數(shù)據(jù)被加載到in memory區(qū)域之后就可以通過sql語句對它們進(jìn)行訪問了。分析型查詢的一個很大的特點就是它只關(guān)心表當(dāng)中特定的一些列而不是全部的列,而且這些列的值很多時候會有大量的重復(fù)值,并且作為條件的列很多時候都是常見的數(shù)據(jù)類型(例如:數(shù)值,字符串,日期),基于這些特點,Oracle的in memory組件也做了相應(yīng)的設(shè)計來提高這些分析型查詢語句的性能。

首先,在IMCU當(dāng)中每一個列都會包含對應(yīng)的字典信息和存儲索引信息。在加載過程當(dāng)中,工作進(jìn)程會將對應(yīng)的IMCU中每個列所擁有的不同值編寫成一個字典,之后為該列的每一行數(shù)據(jù)指定一個keyvalue,用這個keyvalue來代替具體的值,這樣做既可以節(jié)省空間也為將來查詢時能夠使用CPU的SIMD技術(shù)做準(zhǔn)備。而存儲索引(StorageIndex)實際上是數(shù)據(jù)倉庫中常見的一種技術(shù),他通過記錄某一個列的最大值和最小值的方式能夠避免訪問大量不滿足條件的數(shù)據(jù)。在IMCU中每個列的頭信息當(dāng)中都會保存這個列在對應(yīng)的IMCU當(dāng)中的最大值和最小值,以及他們所對應(yīng)的偏移量。通過這種方法就可以在查詢數(shù)據(jù)時通過對比最大和最小值的方式快速過濾掉不滿足條件的數(shù)據(jù),而且一旦數(shù)據(jù)改變影響到了存儲索引中的信息,可以快速定位到對應(yīng)的位置。但是需要指出的是,存儲索引并不見得適用于所有的where條件(謂詞)。

另外,由于數(shù)據(jù)已經(jīng)被加載到了內(nèi)存當(dāng)中,所以絕大部分的操作都是需要通過cpu來實現(xiàn)的,I/O相關(guān)的操作基本不會出現(xiàn)了(除非被查詢的表有一部分?jǐn)?shù)據(jù)還沒有被加載到in memory區(qū)域中來)。如何能夠更加高效的利用CPU資源就成為了決定性能的一個重要因素,所以O(shè)racle采用了SIMD技術(shù)(Single Instruction processing Multiple Data values)使CPU能在一個指令當(dāng)中訪問多個數(shù)據(jù),但是由于SIMD所支持的指令是有限的,所以這也解釋了為什么Oracle在構(gòu)建IMCU時會為每個列都創(chuàng)建字典信息。圖3描述了SIMD訪問數(shù)據(jù)的基本概念.

oracle 12c 列式存儲 ( In Memory 理論)

圖3

 

在上圖中,sales表被加載到了in memory area當(dāng)中,而且IMCU中PROMO_ID列的頭信息當(dāng)中也包含了該列的字典信息,該列當(dāng)中的每一行的值都已經(jīng)被轉(zhuǎn)換成為了keyvalue,當(dāng)查詢條件為PROMO_ID=9999是,就可以利用SIMD技術(shù)使CPU每次比較多行數(shù)據(jù),從而極大地提升了查詢的性能。

最后,我們可以通過在執(zhí)行計劃中查找“TABLE ACCESS INMEMORY FULL TEST”信息來確認(rèn)是否使用了in memory選項訪問表。例如: 
oracle 12c 列式存儲 ( In Memory 理論)

3.2多表連接

除了針對訪問表的優(yōu)化,in memory組件針對表連接也進(jìn)行了改進(jìn),主要的特性有:布隆過濾器和in memory聚合。

對于布隆過濾器(Bloom Filters),相信大家并不陌生。它的主要作用就是判斷某一個數(shù)據(jù)是否出現(xiàn)在另一個集合當(dāng)中,或者用于比較大數(shù)據(jù)集合之間的共同元素。Oracle從10g開始就在處理一些SQL語句中的表連接時使用布隆過濾器。如果表連接中涉及到的表都已經(jīng)指定了in memory屬性,并且已經(jīng)加載到了in memory area當(dāng)中,那么優(yōu)化器會首先選擇連接中的一個表(通常是較小的表),對作為鏈接條件的列進(jìn)行一系列的hash函數(shù),并產(chǎn)生一個結(jié)果位圖(bitmap),之后再對另一個表的數(shù)據(jù)分批進(jìn)行同樣的hash函數(shù),并和之前的結(jié)果位圖進(jìn)行比較,在整個過程中并不會產(chǎn)生I/O而且SIMD技術(shù)在比較過程中也可以被使用,所以布隆過濾器的引入使in memory在處理表連接時變得更加高效。

CBO會在制定執(zhí)行計劃時自動判斷是否使用布隆過濾器,用戶不需要手動指定。如果在執(zhí)行計劃中看到了以下的信息,說明布隆過濾器被使用了。

oracle 12c 列式存儲 ( In Memory 理論)

在上面的執(zhí)行計劃說明:

1.首先在in memory area中訪問了表“TEST_SMALL”,就是執(zhí)行計劃中的第5步,之后構(gòu)建了鏈接使用的過濾器(BF0000),也就是執(zhí)行計劃中的第4步。 
2.之后在in memory area中訪問了表“TEST_BIG”,就是執(zhí)行計劃中的第7步,之后使用了之前構(gòu)建的過濾器。

3.3多表連接

在以分析型的查詢語句為主的數(shù)據(jù)倉庫應(yīng)用當(dāng)中,除了簡單的表連接,還經(jīng)常出現(xiàn)多表的鏈接,而且經(jīng)常會包含一些聚合和分組操作,例如數(shù)據(jù)倉庫應(yīng)用當(dāng)中的星型查詢。針對這種查詢,oracle提出了向量分組(VectorGroupBY)特性來提高select語句的性能。向量分組是一個兩階段的過程:

階段1:CBO會找到查詢中數(shù)據(jù)量較小的維度表(Dimension table),將滿足條件的作為和龐大的事實表(Fact table)進(jìn)行連接的列找出來并生成向量組(Vector Group)。之后將向量組和需要進(jìn)行分組或者聚合的事實表中的列組合,形成一個多維數(shù)組和若干個臨時表。

階段2:在事實表上應(yīng)用上一階段產(chǎn)生的向量分組,之后向臨時表當(dāng)中添加需要計算分組或聚合結(jié)果的列的值。最后將這些臨時表的數(shù)據(jù)應(yīng)用到多維數(shù)組中,計算出最后的分組或者聚合結(jié)果。

在整個過程中向量分組的構(gòu)建和向量于事實表的比較都是在內(nèi)存中完成的,而且SIMD也會被使用,所以可以極大的提升這種查詢的性能。當(dāng)然,由于這種操作都是在內(nèi)存中完成的,所以對系統(tǒng)的內(nèi)存資源要求也是比較大的,要求運(yùn)行這種查詢的進(jìn)程擁有足夠的PGA空間。下面的執(zhí)行計劃說明了分組向量在查詢中的應(yīng)用:

oracle 12c 列式存儲 ( In Memory 理論)

根據(jù)上面的執(zhí)行計劃:

-首先,表”TEST_SMALL_1”和”TEST_SMALL_2”被訪問,當(dāng)然它們都已經(jīng)被加載到了in memory area 
當(dāng)中。之后分組向量被構(gòu)建,他們是”KV0000”和”KV0001”,而且在和需要分組的表進(jìn)行結(jié)合后,臨時表也被創(chuàng)建了出來,它們是“SYS_TEMP_0FD9D6604_116B7C6”和“SYS_TEMP_0FD9D6604_116B7C6”。 
-表“TEST_BIG”被訪問,之后向量分組被應(yīng)用到了這個表上。然后開始向臨時表當(dāng)中添加分組結(jié)果。 
-多維數(shù)組中的結(jié)果被生成,它是“VW_VT_F486F43F”。最后通過“HASH GROUPBY”的方式完成最后的分組。

4.in memory和RAC的融合

延續(xù)Oracle新特性的一貫特點,in memory特性也可以和已經(jīng)存在的其它數(shù)據(jù)庫組件兼容,例如RAC,從而實現(xiàn)系統(tǒng)的高可用性和可擴(kuò)展性。由于RAC屬于典型的share everything結(jié)構(gòu),它可以同時在多個節(jié)點打開相同的數(shù)據(jù)庫,所以對于同一個數(shù)據(jù)庫對象,它可以被加載(populate)到多個節(jié)點上去。當(dāng)然,前提條件是這些節(jié)點的數(shù)據(jù)庫實例都設(shè)置了in memory area(參數(shù)in memory_size不等于0)。既然數(shù)據(jù)可以被加載到多個節(jié)點,那么就意味著我們需要思考兩個問題:

-問題1:如何將數(shù)據(jù)分布到多個節(jié)點。 
-問題2:數(shù)據(jù)是否有必要在in memory area當(dāng)中保存冗余來確保高可用性。

對于數(shù)據(jù)的分布方式,oracle提供了根據(jù)數(shù)據(jù)的ROWID范圍或根據(jù)表的分區(qū)(或子分區(qū))兩種方式來將數(shù)據(jù)分布到多個節(jié)點上。第一種方法是指將表的數(shù)據(jù)按照rowid的范圍劃分成若干份,之后將每份數(shù)據(jù)均勻的加載到不同的節(jié)點當(dāng)中去,這種分布方式比較適用于數(shù)據(jù)分布不均勻的表,而且應(yīng)用程序?qū)Ρ淼脑L問在每個實例上都是比較均勻的場景。例如: 
ALTER TABLE test INMEMORY DISTRIBUTE BY ROWID RANGE; 
第二種方式適用于分區(qū)表,oracle會根據(jù)分區(qū)的定義將每個分區(qū)加載到不同節(jié)點的in memory area當(dāng)中去,這種分布方式比較適合數(shù)據(jù)分布均勻的表。如果應(yīng)用程序?qū)Ρ淼脑L問在每個實例上都是比較均勻的,尤其適合hash分區(qū)表。例如:ALTER TABLE lineorder INMEMORY DISTRIBUTE BY PARTITION;

對于數(shù)據(jù)是否應(yīng)該在in memory area中保存冗余,如果是普通的RAC數(shù)據(jù)庫,那么數(shù)據(jù)并不會在in memory area中保存冗余;而對于Exadata一體機(jī),in memory area中的數(shù)據(jù)是可以設(shè)置冗余的。之所以選擇這樣做的原因在于,非Exadata一體機(jī)的RAC系統(tǒng)的私網(wǎng)配置千差萬別,如果選擇保存冗余的話,一旦當(dāng)某一個實例down掉之后,意味著會有大量的數(shù)據(jù)需要在節(jié)點的私網(wǎng)之間進(jìn)行傳輸,以便確保數(shù)據(jù)的冗余,如果私網(wǎng)的性能不能得到保證的時候,這種數(shù)據(jù)的傳輸可能消耗大量的時間和網(wǎng)絡(luò)資源,并導(dǎo)致嚴(yán)重的后果。而Exadata一體機(jī)的私網(wǎng)采用光纖網(wǎng)絡(luò),而且使用了先進(jìn)的RDS協(xié)議,數(shù)據(jù)傳輸可以達(dá)到幾十G每秒,所以在處理由于節(jié)點故障導(dǎo)致的大量私網(wǎng)數(shù)據(jù)傳輸時,仍然可以保證集群的私網(wǎng)正常工作。

另外,由于目前硬件層面的高可用技術(shù)已經(jīng)非常成熟,一個數(shù)據(jù)庫實例或者節(jié)點down掉的事故大部分都是一次性的,很快就能恢復(fù)。所以O(shè)racle在發(fā)現(xiàn)某一個實例或者節(jié)點fail之后并不會馬上觸發(fā)數(shù)據(jù)的重新分布,而是會等待一段時間以便讓問題節(jié)點或?qū)嵗軌蛑匦聠硬⒓虞d自己的數(shù)據(jù),只有當(dāng)?shù)却龝r間超時之后,其他節(jié)點才會觸發(fā)數(shù)據(jù)重新分布的過程,將失敗節(jié)點的in memory area中的數(shù)據(jù)重新分布到正常節(jié)點?;谶@種設(shè)計模式,建議在使用RAC系統(tǒng)上的in memory選項時應(yīng)該為每個節(jié)點的in memory area預(yù)留出一部分空間,以便確保數(shù)據(jù)重新分配時仍然有足夠的空間。 
下面的圖4和圖5描述了Exadata環(huán)境和非Exadata環(huán)境in memory area保存數(shù)據(jù)的區(qū)別

oracle 12c 列式存儲 ( In Memory 理論)

圖4-Exadata環(huán)境

 

oracle 12c 列式存儲 ( In Memory 理論)

圖5-非Exadata環(huán)境

 

根據(jù)上面的圖形不難發(fā)現(xiàn),在RAC環(huán)境下的,每個節(jié)點都不會包含表當(dāng)中的所有數(shù)據(jù)。所以在RAC環(huán)境下,需要啟用oracle的自動并行查詢(AutoDOP)才能夠使用in memory的方式訪問加載到in memory area中的表。另外還要說明的是在多實例的并發(fā)查詢中實例之間傳輸?shù)牟⒉皇荌MCU,而是每個節(jié)點都會對本節(jié)點的數(shù)據(jù)運(yùn)行相同的sql語句,之后把自己的結(jié)果集發(fā)送給發(fā)起sql語句的實例,組成最終的結(jié)果返回給用戶。例如:一個4節(jié)點的RAC數(shù)據(jù)庫,表sales已經(jīng)被加載到了in memory area當(dāng)中。運(yùn)行下面的查詢: 
select sum(stock) from sales where store_id in (100,200,300) and order_date=to_date(‘2016-01-01’, ‘yyyy-mm-dd’);

CBO首先會計算使用in memory scan的成本,如果成本最低,CBO就會選擇使用在in memory area中訪問sales表。接下來,oracle會訪問數(shù)據(jù)字典中的信息,找到這個表被加載到了哪些實例,并在對應(yīng)的節(jié)點啟動相應(yīng)的并發(fā)進(jìn)程(parallelslave),把這個查詢語句發(fā)送給并發(fā)進(jìn)程運(yùn)行。每個實例的并發(fā)進(jìn)程運(yùn)行完對應(yīng)的sql語句之后,把產(chǎn)生的匯總值發(fā)送給發(fā)起查詢的實例,生成最終的匯總值并返回給客戶。在整個過程中,并不是IMCU在實例之間傳遞,而是匯總值在傳遞,所以能夠避免大量的私網(wǎng)數(shù)據(jù)通信。

以上就是作者對oracle 12c in memory組件一些粗淺的介紹,希望對各位使用Oracle數(shù)據(jù)庫進(jìn)行開發(fā)的人員有所幫助,能夠在使用了in memoery組件的oracle數(shù)據(jù)庫上開發(fā)應(yīng)用程序時有些借鑒作用。

轉(zhuǎn):http://blog.sina.com.cn/s/blog_74a7d3390102wegl.html


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

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

AI