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