溫馨提示×

溫馨提示×

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

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

12C新特性___In-Memory列式存儲的總結

發(fā)布時間:2020-08-10 03:31:55 來源:ITPUB博客 閱讀:333 作者:lusklusklusk 欄目:關系型數(shù)據(jù)庫

官方文檔

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/inmem/concepts-for-the-im-column-store.html#GUID-5A72B48A-8427-41AE-9220-E46042BC90C4

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/inmem/configuring-the-im-column-store.html#GUID-8844C889-E381-4B77-8A51-7AA6462B14D7

The IM column store encodes data in a columnar format: each column is a separate structure. The columns are stored contiguously, which optimizes them for analytic queries. The database buffer cache can modify objects that are also populated in the IM column store. However, the buffer cache stores data in the traditional row format. Data blocks store the rows contiguously, optimizing them for transactions.

When you enable an IM column store, the SGA manages data in separate locations: the In-Memory Area and the database buffer cache. 

The IM column store maintains copies of tables, partitions, and individual columns in a special compressed columnar format that is optimized for rapid scans. 

In-Memory Column Store意思就是In-Memory列式存儲,每一列都是一個單獨的結構,它的優(yōu)點就是只需要訪問表的部分列,不像database buffer cache以傳統(tǒng)的行格式存儲數(shù)據(jù),需要訪問表的所有列。但是傳統(tǒng)的database buffer cache也可以修改填充在In-Memory內存中的對象。

In-Memory列式存儲特性開啟后數(shù)據(jù)庫啟動時會在SGA中分配一塊靜態(tài)的內存池In-Memory Area,用于存放以In-Memory列式存儲的用戶表。

In-Memory列式存儲以一種特殊的壓縮列格式維護表、分區(qū)和單個列的副本,這種格式是為快速掃描而優(yōu)化的。

In memory內存中的數(shù)據(jù)的同步機制

一旦加載到In memory內存中的表涉及DML了,就需要一種機制保證In memory內存中的數(shù)據(jù)的一致性,因為DML語句的修改在內存中僅修改database buffer cache和log buffer,如何把這些修改的數(shù)據(jù)同步到In memory內存中呢。Oracle 是通過Transaction journal來確保數(shù)據(jù)的一致性的。如果DML語句修改的表已經(jīng)存在In memory內存中,在DML提交后就把該DML的元數(shù)據(jù)比如表名tablename和行號rowid記錄到transaction journal,并把該表在In memory內存中的SCN標識為過期。如果后面新的查詢需要訪問該表在In memory內存中的數(shù)據(jù),就會根據(jù)該表原來在In memory內存中的數(shù)據(jù)+transaction journal+database buffer cache進行訪問

當然,如果DML語句不斷發(fā)生的話,就會使transaction journal的數(shù)據(jù)越來越多,甚至出現(xiàn)In memory內存中的大部分數(shù)據(jù)都是過期的舊數(shù)據(jù),這對于in memory查詢的性能傷害是很大的。所以,Oracle定義了一個閥值staleness threshold,當in memory中舊數(shù)據(jù)的比例達到這個閥值時就會觸發(fā)Repopulate的過程,oracle默認2分鐘就會檢查一次是否觸發(fā)了該閥值

In-Memory列式存儲涉及參數(shù)

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/inmem/init-parameters-for-im-column-store.html#GUID-A67ABCAC-C6B9-499E-8AE0-BD7922B239BE

In-Memory列式存儲涉及的視圖

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/inmem/views-related-to-im-column-store.html#GUID-2EBF8D9B-FA9E-4D67-8934-5908E6018D4E

關于In-Memory的一些總結

1、數(shù)據(jù)庫級別啟用In-Memory列式存儲的兩個前提條件:MEMORY_TARGET必須設置且大于100M;COMPATIBLE參數(shù)必須設置且大于12.1.0

2、表空間、表、分區(qū)和物化視圖都可以啟用In-Memory列式存儲,當前表空間啟用In-Memory列式存儲后,默認為該表空間下以后新增所有表和物化視圖都啟用了In-Memory列式存儲,該表空間下之前已經(jīng)存在的表不受影響,設置表空間啟用In-Memory列式存儲時INMEMORY關鍵字前面必須加default

3、表級別啟用In-Memory列式存儲的前提條件:create table或alter table時指定了INMEMORY

4、查詢表是否啟用In-Memory列式存儲,參見USER_TABLES.INMEMORY是否等于'ENABLED',等于ENABLED說明啟用了

5、 表已經(jīng)啟用In-Memory列式存儲不代表該表的數(shù)據(jù)就已經(jīng)自動加載到In-Memory內存中,只有在實例啟動或訪問該對象時才會加載到In-Memory內存中,如果想把表數(shù)據(jù)立即加載到In-Memory內存中,則對該表強制執(zhí)行全表掃描或使用DBMS_INMEMORY.POPULATE即可。 只要對象In-Memory列式存儲的PRIORITY的級別不是none,則實例啟動或該對象對應的PDB啟動時會自動加載該對象到In-Memory內存中,查看表的數(shù)據(jù)是否已經(jīng)進入了In-Memory內存區(qū),參見V$IM_SEGMENTS.SEGMENT_NAME。 某表已經(jīng)存在V$IM_SEGMENTS的話,truncate table后V$IM_SEGMENTS中該表記錄消失,delete table后V$IM_SEGMENTS中該表記錄還在

6、12.2.0版本開始可以使用ILM ADO POLICY對In-Memory列式存儲進行相應設置,ILM ADO POLICY在數(shù)據(jù)庫級別生效,而不是實例級別,Information Lifecycle Management (ILM) Automatic Data Optimization (ADO) POLICY信息生命周期管理自動數(shù)據(jù)優(yōu)化政策意思就是可以決定In-Memory列式存儲在哪張表上什么時候什么情況下生效,什么時候什么情況下失效。ALTER TABLE TABLE_NAME ILM ADD POLICY SET|MODIFY|NO INMEMORY

7、可以只把表的特定字段列啟用In-Memory,使用inmemory指定這些特定字段,同時必須使用no inmemory把剩余的列寫進去,字段列啟用In-Memory的話,其中列的類型不能是LONG or LONG RAW column, an out-of-line column (LOB, varray, nested table column), or an extended data type column,某表只有部分字段列啟用In-Memory的話,通過USER_TABLES.INMEMORY='ENABLED'查不到該表,可以通過V$IM_COLUMN_LEVEL.INMEMORY_COMPRESSION<>'NO INMEMORY'來查

8、無法使用In-Memory列式存儲的對象有:Indexes、Index-organized tables、Hash clusters、Objects owned by the SYS user and stored in the SYSTEM or SYSAUX tablespace、If you enable a table for the IM column store and it contains any of the following types of columns, then these columns will not be populated in the IM column store:Out-of-line columns (varrays, nested table columns, and out-of-line LOBs)、Columns that use the LONG or LONG RAW data types、Extended data type columns

9、如果不指定inmemory的priority優(yōu)先級別,默認是none,則只有全表掃描訪問對象時才會把該對象放入In-Memory內存中。通過索引掃描或通過rowid獲取該對象都不會把該對象放入In-Memory內存中。如果priority級別不是none,則在數(shù)據(jù)庫啟動過程中會自動把對象In-Memory放入內存中,或根據(jù)優(yōu)先級別把對象放入In-Memory內存中

10、如果不指定inmemory的MEMCOMPRESS壓縮級別,默認是MEMCOMPRESS FOR QUERY LOW

11、如果不指定DUPLICATE時,默認就是NO DUPLICATE,只有RAC環(huán)境且是Oracle Engineered System環(huán)境才能使用DUPLICATE或DUPLICATE ALL,否則就算是使用了DUPLICATE或DUPLICATE ALL也不起作用,還是當成NO DUPLICATE.

12、如果不指定distribute時,默認是auto,默認存在IM中的表會分布在各個節(jié)點之中。只有RAC環(huán)境才能使用distribute

13、關于populate和repopulate的區(qū)別,populate是把磁盤上的現(xiàn)有數(shù)據(jù)轉換為列格式并存放到In-Memory內存中,repopulate是把將新數(shù)據(jù)加載到In-Memory內存中,可以簡單理解為populate初始化全量刷數(shù)據(jù)進入In-Memory內存中,repopulate是增量刷數(shù)據(jù)進入In-Memory內存中

一些實驗結果

1、表空間設置為inmemory

創(chuàng)建表空間或修改表空間為inmemory,inmemory關鍵字前面必須加上default

SQL> create tablespace tablespace1 datafile '/u02/data/tablespace2.dbf' size 100M inmemory;

ERROR at line 1:

ORA-02180: invalid option for CREATE TABLESPACE

SQL> create tablespace tablespace1 datafile '/u02/data/tablespace2.dbf' size 100M default inmemory;

Tablespace created.

SQL> alter tablespace USERS inmemory;

ERROR at line 1:

ORA-02142: missing or invalid ALTER TABLESPACE option

SQL> alter tablespace USERS default inmemory;

Tablespace altered.

2、表設置為inmemory

如果create table as方式,則inmemory放在as前面

create table table1 (hid number(10)) inmemory;

alter table table2 inmemory;

create table t4 inmemory as select * from t1;--t4啟用了In-Memory列式存儲

create table t5 as select * from t1 inmemory;--t5沒有啟用了In-Memory列式存儲

3、物化視圖設置為inmemory

create materialized view mview1 inmemory as select * from table1;

alter materialized view mview2 inmemory 

4、分區(qū)表某些分區(qū)設置為inmemory

建表是最后兩個分區(qū)SALES_Q4_2019、SALES_Q1_2020都沒有啟用In-Memory列式存儲,參見user_tab_partitions.inmemory,最后修改SALES_Q4_2019分區(qū)啟用In-Memory列式存儲

CREATE TABLE sales1( prod_id NUMBER(6),time_id DATE,channel_id varchar2(100)) 

PARTITION BY RANGE (time_id)

(PARTITION SALES_Q1_2019 

      VALUES LESS THAN (TO_DATE('01-APR-2019','DD-MON-YYYY')) INMEMORY,

 PARTITION SALES_Q2_2019

      VALUES LESS THAN (TO_DATE('01-JUL-2019','DD-MON-YYYY')) INMEMORY,

 PARTITION SALES_Q3_2019 

      VALUES LESS THAN (TO_DATE('01-OCT-2019','DD-MON-YYYY')) INMEMORY,

 PARTITION SALES_Q4_2019 

      VALUES LESS THAN (TO_DATE('01-JAN-2020','DD-MON-YYYY')) NO INMEMORY,

 PARTITION SALES_Q1_2020 

      VALUES LESS THAN (MAXVALUE));

alter table sales1 modify partition SALES_Q4_2019 inmemory;

5、字段列設置為inmemory

如下創(chuàng)建的表table1,只有CREATED_APPID字段沒有啟用In-Memory列式存儲,其他列都啟用了

所以一張表只要某些列設置為inmemory時,必須使用no inmemory把剩余的列寫進去

create table table1 as select * from dba_objects;

alter table table1 inmemory (OWNER) no inmemory (CREATED_APPID);

When a database is restarted, all of the data for database objects with a priority level other than NONE are populated in the IM column store during startup. 

重新啟動數(shù)據(jù)庫后,在啟動期間,優(yōu)先級比NONE高的數(shù)據(jù)庫對象的所有數(shù)據(jù)都將加載進入In-Memory中。

Population

The operation of reading existing data blocks from data files, transforming the rows into columnar format, and then writing the columnar data to the IM column store. In contrast, loading refers to bringing new data into the database using DML or DDL.

Population, which transforms existing data on disk into columnar format, is different from repopulation, which loads new data into the IM column store. Because IMCUs are read-only structures, Oracle Database does not populate them when rows change. Rather, the database records the row changes in a transaction journal, and then creates new IMCUs as part of repopulation

從數(shù)據(jù)文件讀取現(xiàn)有數(shù)據(jù)塊,將行轉換為列格式,然后將列數(shù)據(jù)寫入IM列存儲的操作。 相反,loading是指使用DML或DDL將新數(shù)據(jù)帶入數(shù)據(jù)庫。

Population是將磁盤上的現(xiàn)有數(shù)據(jù)轉換為列格式,Population不同于將新數(shù)據(jù)加載到IM列存儲中的repopulation。 因為IMCU是只讀結構,所以當行更改時,Oracle數(shù)據(jù)庫不會填充它們。 而是,數(shù)據(jù)庫將行更改記錄在transaction journal中,然后創(chuàng)建新的IMCU作為repopulation的一部分

IMCU

An In-Memory Compression Unit (IMCU) is a compressed, read-only storage unit that contains data for one or more columns.

內存中壓縮單元(IMCU)是一種壓縮的只讀存儲單元,其中包含一個或多個列的數(shù)據(jù)。

Transaction journal

Metadata in a Snapshot Metadata Unit (SMU) that keeps the IM column store transactionally consistent.

快照元數(shù)據(jù)單元(SMU)中的元數(shù)據(jù),可以使IM列存儲在事務上保持一致。

Every SMU contains a transaction journal. The database uses the transaction journal to keep the IMCU transactionally consistent.

The database uses the buffer cache to process DML, just as when the IM column store is not enabled. For example, an UPDATE statement might modify a row in an IMCU. In this case, the database adds the rowid for the modified row to the transaction journal and marks it stale as of the SCN of the DML statement. If a query needs to access the new version of the row, then the database obtains the row from the database buffer cache.

The database achieves read consistency by merging the contents of the column, transaction journal, and buffer cache. When the IMCU is refreshed during repopulation, queries can access the up-to-date row directly from the IMCU.

每個SMU都包含一個transaction journal。 數(shù)據(jù)庫使用transaction journal來使IMCU保持事務一致。

與未啟用IM列存儲時一樣,數(shù)據(jù)庫使用緩沖區(qū)高速緩存來處理DML。 例如,一條UPDATE語句可能會修改IMCU中的一行。 在這種情況下,數(shù)據(jù)庫將已修改行的行標識添加到transaction journal中,并從DML語句的SCN開始將其標記為過期。 如果查詢需要訪問該行的新版本,則數(shù)據(jù)庫從數(shù)據(jù)庫緩沖區(qū)高速緩存中獲取該行。

數(shù)據(jù)庫通過合并列,transaction journal和緩沖區(qū)高速緩存的內容來實現(xiàn)讀取一致性。 在重新填充期間刷新IMCU時,查詢可以直接從IMCU訪問最新行。

Repopulation

The automatic refresh of a currently populated In-Memory Compression Unit (IMCU) after its data has been significantly modified. In contrast, population is the initial creation of IMCUs in the IM column store.

在當前populated內存中壓縮單元(IMCU)的數(shù)據(jù)進行了重大修改之后,它會自動刷新。 相反,population是IM列存儲中IMCU的初始創(chuàng)建。

向AI問一下細節(jié)

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

AI