Oracle 12.2啟用數(shù)據(jù)庫(kù)對(duì)象的In-Memory轉(zhuǎn)換填充
所謂數(shù)據(jù)庫(kù)的列式轉(zhuǎn)換填充,就是數(shù)據(jù)庫(kù)從磁盤(pán)讀取現(xiàn)有的行格式數(shù)據(jù),將其轉(zhuǎn)換為列格式,然后再存儲(chǔ)到IM列存儲(chǔ)中的過(guò)程。將數(shù)據(jù)庫(kù)對(duì)象填充到列式存儲(chǔ)會(huì)極大地提高訪問(wèn)效率。只有具有In-Memory屬性的對(duì)象才能夠做轉(zhuǎn)換填充。
啟用對(duì)象的列式填充的目的
IM列存儲(chǔ)不會(huì)自動(dòng)將數(shù)據(jù)庫(kù)中的所有對(duì)象加載到IM列存儲(chǔ)中。如果不使用DDL將任何對(duì)象指定為INMEMORY,則IM列存儲(chǔ)將保持為空。 將用戶(hù)指定的In-Memory對(duì)象的行轉(zhuǎn)換為列格式是必需的,以便它們可用于分析查詢(xún)。
將磁盤(pán)上現(xiàn)有數(shù)據(jù)轉(zhuǎn)換為列格式的填充與通常所說(shuō)的列式填充不同,后者只是將新數(shù)據(jù)加載到IM列存儲(chǔ)中。 因?yàn)镮MCU是只讀結(jié)構(gòu),所以當(dāng)行更改時(shí),Oracle數(shù)據(jù)庫(kù)不會(huì)自動(dòng)填充它們。而前者,則是數(shù)據(jù)庫(kù)記錄事務(wù)日志中的行修改記錄,然后創(chuàng)建新的IMCU作為IM的一部分。
列式轉(zhuǎn)換填充的原理
可以指定數(shù)據(jù)庫(kù)在實(shí)例啟動(dòng)時(shí)或訪問(wèn)INMEMORY對(duì)象時(shí)填充IM列存儲(chǔ)中的對(duì)象。 列式轉(zhuǎn)換填充算法在單實(shí)例數(shù)據(jù)庫(kù)和RAC中有所區(qū)別。
DDL語(yǔ)句包括一個(gè)INMEMORY PRIORITY子句,為子句隊(duì)列提供更多的控制。
優(yōu)先級(jí)設(shè)置適用于整個(gè)表,分區(qū)或子分區(qū),而不適用于不同的列子集。 在對(duì)象上設(shè)置INMEMORY屬性意味著此對(duì)象是IM列存儲(chǔ)中的填充的候選項(xiàng)。 這并不意味著數(shù)據(jù)庫(kù)會(huì)立即填充該對(duì)象。 Oracle數(shù)據(jù)庫(kù)管理優(yōu)先級(jí)如下:
1、按需填充
默認(rèn)情況下,INMEMORY PRIORITY參數(shù)設(shè)置為NONE。 在這種情況下,數(shù)據(jù)庫(kù)僅在通過(guò)全表掃描訪問(wèn)對(duì)象時(shí)填充該對(duì)象。 如果對(duì)象永遠(yuǎn)不被訪問(wèn),或者只有通過(guò)索引掃描訪問(wèn)或者通過(guò)rowid進(jìn)行訪問(wèn),則不會(huì)發(fā)生轉(zhuǎn)換。
2、基于優(yōu)先級(jí)的填充
當(dāng)PRIORITY設(shè)置為非NONE值時(shí),Oracle數(shù)據(jù)庫(kù)將使用內(nèi)部管理的優(yōu)先級(jí)隊(duì)列自動(dòng)填充對(duì)象。 在這種情況下,全掃描不是填充的必要條件。
基于優(yōu)先級(jí)的填充過(guò)程如下:
a、在數(shù)據(jù)庫(kù)實(shí)例重新啟動(dòng)后,自動(dòng)填充IM列中的柱狀數(shù)據(jù)
b、基于指定優(yōu)先級(jí)的INMEMORY對(duì)象的隊(duì)列人口
例如,使用INMEMORY PRIORITY CRITICAL更改的表優(yōu)先于使用INMEMORY PRIORITY HIGH更改的表,該表依次優(yōu)先于使用INMEMORY PRIORITY LOW更改的表。 如果IM列存儲(chǔ)空間不足,則Oracle數(shù)據(jù)庫(kù)在空間可用之前不會(huì)填充其他對(duì)象。
c、等待從ALTER TABLE或ALTER MATERIALIZED VIEW語(yǔ)句返回,直到對(duì)象的更改記錄在IM列存儲(chǔ)中
在IM列存儲(chǔ)中填充一個(gè)段后,數(shù)據(jù)庫(kù)僅在段被刪除或移動(dòng)時(shí)才將其推離,或者使用NO INMEMORY屬性更新段。 可以手動(dòng)或通過(guò)ADO策略驅(qū)逐細(xì)分。
在完成此示例之前,必須為數(shù)據(jù)庫(kù)啟用IM列存儲(chǔ)。
1、以管理員身份登錄數(shù)據(jù)庫(kù),然后查詢(xún)客戶(hù)表,如下所示:
2、顯示查詢(xún)的執(zhí)行計(jì)劃:
3、在IM列存儲(chǔ)中啟用sh.customers表的填充:
4、要確定sh.customers表中的數(shù)據(jù)是否已在IM列存儲(chǔ)中填充,請(qǐng)執(zhí)行以下查詢(xún)(包括樣本輸出):
在這種情況下,由于sh.customers表尚未被掃描,因此在IM列存儲(chǔ)中不會(huì)填充任何片段。
5、使用與步驟1中相同的語(yǔ)句查詢(xún)sh.customers:
6、查詢(xún)游標(biāo)顯示數(shù)據(jù)庫(kù)執(zhí)行完整掃描并訪問(wèn)IM列存儲(chǔ):
7、再次查詢(xún)V$IM_SEGMENTS(包括樣本輸出):
8、DBA_FEATURE_USAGE_STATISTICS視圖確認(rèn)數(shù)據(jù)庫(kù)使用IM列存儲(chǔ)來(lái)檢索結(jié)果:
后臺(tái)進(jìn)程如何填充IMCU
在填充期間,數(shù)據(jù)庫(kù)以其行格式從磁盤(pán)讀取數(shù)據(jù),樞轉(zhuǎn)行以創(chuàng)建列,然后將數(shù)據(jù)壓縮為內(nèi)存中壓縮單元(IMCU)。
工作進(jìn)程(Wnnn)填充IM列存儲(chǔ)中的數(shù)據(jù)。 每個(gè)工作進(jìn)程在對(duì)象的數(shù)據(jù)庫(kù)塊的子集上運(yùn)行。 人口是一種流式傳輸機(jī)制,同時(shí)壓縮數(shù)據(jù)并將其轉(zhuǎn)換為柱狀格式。
INMEMORY_MAX_POPULATE_SERVERS初始化參數(shù)指定要用于IM列存儲(chǔ)群體的***工作進(jìn)程數(shù)。 默認(rèn)情況下,該設(shè)置是CPU_COUNT的一半。 將此參數(shù)設(shè)置為適合您的環(huán)境的值。 更多的工作進(jìn)程導(dǎo)致填充增長(zhǎng),但會(huì)占用更多的CPU資源。 更少的工作進(jìn)程導(dǎo)致人口減少,這降低了CPU開(kāi)銷(xiāo)。
列式填充控制
使用數(shù)據(jù)定義語(yǔ)言(DDL)語(yǔ)句中的INMEMORY子句來(lái)指定哪些對(duì)象有資格進(jìn)入IM列存儲(chǔ)。 可以啟用表空間,表,分區(qū)和物化視圖。
INMEMORY子句
INMEMORY是一個(gè)段級(jí)屬性,而不是列級(jí)屬性。 但是可以將INMEMORY屬性應(yīng)用于特定對(duì)象中的列的子集。
要啟用或禁用IM列存儲(chǔ)的對(duì)象,請(qǐng)?jiān)谝韵氯魏握Z(yǔ)句中指定INMEMORY子句:
1、CREATE TABLESPACE or ALTER TABLESPACE
默認(rèn)情況下,表空間中的所有表和實(shí)例化視圖都對(duì)IM列存儲(chǔ)啟用。 表空間中的單個(gè)表和實(shí)例化視圖可能具有不同的INMEMORY屬性。 單個(gè)數(shù)據(jù)庫(kù)對(duì)象的屬性將覆蓋表空間的屬性。
2、CREATE TABLE or ALTER TABLE
默認(rèn)情況下,IM列存儲(chǔ)填充表中的所有非虛擬列。 您可以指定表的全部或一部分列。 例如,您可以將oe.product_information中的weight_class和catalog_url列從資格中排除。 對(duì)于分區(qū)表,您可以填充IM列存儲(chǔ)中的全部或一部分分區(qū)。 默認(rèn)情況下,對(duì)于分區(qū)表,所有表分區(qū)都將繼承INMEMORY屬性。
3、CREATE MATERIALIZED VIEW or ALTER MATERIALIZED VIEW
對(duì)于分區(qū)實(shí)體化視圖,可以填充IM列存儲(chǔ)中的所有或一部分分區(qū)。
DBA_TABLES視圖中的INMEMORY列指示哪些表具有INMEMORY屬性設(shè)置(ENABLED)或未設(shè)置(DISABLED)。
以下對(duì)象不符合IM列存儲(chǔ)中的填充資格:
索引;索引組織表;哈希集群;由SYS用戶(hù)擁有并存儲(chǔ)在SYSTEM或SYSAUX表空間中的對(duì)象。
如果為IM列存儲(chǔ)啟用了表,并且它包含以下任何類(lèi)型的列,則這些列將不會(huì)在IM列存儲(chǔ)中填充:
行列(varrays,嵌套表列和行外LOB)
使用LONG或LONG RAW數(shù)據(jù)類(lèi)型的列
擴(kuò)展數(shù)據(jù)類(lèi)型列
對(duì)表進(jìn)行列式填充
假設(shè)以用戶(hù)sh連接到數(shù)據(jù)庫(kù)。 可以使用默認(rèn)壓縮級(jí)別FOR QUERY LOW(參見(jiàn)“內(nèi)存中壓縮”),為IM列存儲(chǔ)中的用戶(hù)表啟用客戶(hù)表:
列式填充的優(yōu)先級(jí)選項(xiàng)
為IM列存儲(chǔ)啟用數(shù)據(jù)庫(kù)對(duì)象時(shí),可以啟用Oracle數(shù)據(jù)庫(kù)來(lái)控制對(duì)象在IM列存儲(chǔ)中的填充(默認(rèn)),也可以指定確定對(duì)象的優(yōu)先級(jí)。
Oracle SQL包括一個(gè)INMEMORY PRIORITY子句,為群體提供了對(duì)隊(duì)列的更多控制。 例如,在填充其他數(shù)據(jù)庫(kù)對(duì)象的數(shù)據(jù)之前,填充數(shù)據(jù)庫(kù)對(duì)象的數(shù)據(jù)可能更重要或更不重要。
下表說(shuō)明了支持的優(yōu)先級(jí)。