In-Memory Column Store IM列存盤是Oracle 12.1.0.2新引入的特性,IM列存盤是系統全域區SGA的一個可選部分,它存盤表、表磁區或其它資料庫物件的副本,IM列存盤包含在Oracle資料庫In-Memory選項中,本部分內容是在Oracle 12.1.0.2版本進行操作,
1 IM列存盤
1.1 IM列存盤介紹
IM列存盤是SGA中一個新的靜態池,IM列存盤中的資料不以傳統的行格式存盤,而是以列格式存盤,每個列存盤為一個單獨的結構,IM列存盤并不會替代資料庫緩沖區快取,而是作為它的一個補充,因此資料可以以行和列的格式并存在記憶體中,
要啟用IM列存盤,必須將INMEMORY_SIZE初始化引數設定為非零值,最小值為100M,可以在以下任意級別啟用列存盤特性:
- 列
- 表
- 物化視圖
- 表空間
- 磁區
1.2 IM列壓縮
在IM列存盤中,可以對資料進行壓縮,并且SQL查詢直接在被壓縮的資料上執行,IM列存盤的壓縮方法如下:

在SQL陳述句中,MEMCOMPRESS關鍵字之前必須加上INMEMORY關鍵字,
1.3 IM列存盤資料填充
當為IM列存盤啟用資料庫物件時,默認情況下,是由資料庫來控制何時在IM列存盤中填充資料庫物件的資料,當然,也可以通過指定一個優先級別來確定填充填充對列中資料庫物件的優先級,SQL陳述句通過INMEMORY PRIORITY設定優先級別,優先級別包含以下內容:

2 資料庫啟用IM列存盤
在表、表磁區、物化視圖和表空間啟用IM列存盤之前,必須為資料庫啟用IM列存盤,資料庫啟用IM列存盤的步驟如下:
1)兼容性設定,確保資料庫兼容性是12.1.0或更高級別
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 12.1.0.2.0
noncdb_compatible boolean FALSE
2)設定INMEMORY_SIZE初始化引數為非零值,最小為100M
SQL> alter system set inmemory_size=400M scope=spfile;
System altered.
3)重啟資料庫,初始化SGA中的IM列存盤
SQL> startup
ORACLE instance started.
Total System Global Area 1644167168 bytes
Fixed Size 2925024 bytes
Variable Size 973082144 bytes
Database Buffers 234881024 bytes
Redo Buffers 13848576 bytes
In-Memory Area 419430400 bytes
Database mounted.
Database opened.
可以看到出現了一塊記憶體區域;In-Memory Area
4)檢查當前為IM列存盤分配的記憶體大小
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 400M
3 表啟用/禁用列存盤
對于表的IM列存盤的啟用和禁用,只需在create table或alter table陳述句中指定inmemory子句即可,
3.1 IM列存盤和非IM列存盤比較
1)創建測驗表,并統計未使用IM列存盤時表的大小
SQL> create table alen.t_objects as select * from dba_objects;
Table created.
SQL> select bytes/1024/1024 from dba_segments where owner='ALEN' and segment_name='T_OBJECTS';
BYTES/1024/1024
---------------
13
2)查看IM記憶體區域大小
SQL> select * from v$inmemory_area;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------------- ----------- ---------- -------------------------- ----------
1MB POOL 334495744 0 DONE 0
64KB POOL 67108864 0 DONE 0
3)啟用IM列存盤特性,默認均使用默認值
SQL> alter table alen.t_objects inmemory;
Table altered.
4)查詢匯總資料
SQL> select count(1) from alen.t_objects;
COUNT(1)
----------
91690
5)再次查詢IM記憶體區域,發現已經使用,占用的記憶體列為4M
SQL> select * from v$inmemory_area;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------------- ----------- ---------- -------------------------- ----------
1MB POOL 334495744 4194304 DONE 0
64KB POOL 67108864 131072 DONE 0
SQL> select (4194304+131072)/1024/1024 from dual;
(4194304+131072)/1024/1024
--------------------------
4.125
通過上面的資料可以看出,采用行存盤時,占用的空間為13M,而使用IM列存盤時,占用的空間為4.125M,空間壓縮了30%,
6)查看使用IM列存盤時的執行計劃
SQL> set autotrace on
SQL> select count(1) from alen.t_objects;
COUNT(1)
----------
91690
Execution Plan
----------------------------------------------------------
Plan hash value: 230482234
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 27 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS INMEMORY FULL| T_OBJECTS | 91690 | 27 (0)| 00:00:01 |
---------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
544 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
3.2 指定IM列存盤的壓縮方法
對于壓縮方法的指定,可以參照上面的表格進行設定,
1)指定capacity high壓縮
SQL> drop table alen.t_objects;
Table dropped.
SQL> create table alen.t_objects inmemory memcompress for capacity high as select * from dba_objects;
Table created.
2)查看存盤大小
SQL> select * from v$inmemory_area;
POOL ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_ID
-------------------------- ----------- ---------- -------------------------- ----------
1MB POOL 334495744 1048576 DONE 0
64KB POOL 67108864 131072 DONE 0
SQL> select (1048576+131072)/1024/1024 from dual;
(1048576+131072)/1024/1024
--------------------------
1.125
3)查詢IM段資訊
SQL> select inmemory_size,bytes,inmemory_priority,inmemory_distribute,inmemory_compression from v$im_segments where owner='ALEN' and segment_name='T_OBJECTS';
INMEMORY_SIZE BYTES INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
------------- ---------- -------- --------------- -----------------
1179648 13631488 NONE AUTO FOR CAPACITY HIGH
3.3 指定IM列存盤的填充優先級
對于IM列存盤優先級的指定,可以參照上面的表格進行設定,
1)指定優先級
SQL> drop table alen.t_objects;
Table dropped.
SQL> create table alen.t_objects inmemory memcompress for capacity high priority high as select * from dba_objects;
Table created.
2)查看IM段資訊
SQL> select inmemory_size,bytes,inmemory_priority,inmemory_distribute,inmemory_compression from v$im_segments where owner='ALEN' and segment_name='T_OBJECTS';
INMEMORY_SIZE BYTES INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
------------- ---------- -------- --------------- -----------------
1179648 13631488 HIGH AUTO FOR CAPACITY HIGH
3.4 啟用列級別的IM列存盤
對于表中IM列存盤的使用,除了在表級,還可以在列級別進行IM列存盤的設定,
1)創建列級IM列存盤
SQL> alter table alen.t_objects
2 inmemory memcompress for query high(object_name,object_id,data_object_id)
3 inmemory memcompress for capacity high(created)
4 no inmemory(owner,status);
Table altered.
2)查看IM列資訊
SQL> select column_name,inmemory_compression from v$im_column_level where owner='ALEN' and table_name ='T_OBJECTS';
COLUMN_NAME INMEMORY_COMPRESSION
------------------------------- --------------------------
OWNER NO INMEMORY
OBJECT_NAME FOR QUERY HIGH
SUBOBJECT_NAME DEFAULT
OBJECT_ID FOR QUERY HIGH
DATA_OBJECT_ID FOR QUERY HIGH
OBJECT_TYPE DEFAULT
CREATED FOR CAPACITY HIGH
LAST_DDL_TIME DEFAULT
TIMESTAMP DEFAULT
STATUS NO INMEMORY
TEMPORARY DEFAULT
COLUMN_NAME INMEMORY_COMPRESSION
------------------------------- --------------------------
GENERATED DEFAULT
SECONDARY DEFAULT
NAMESPACE DEFAULT
EDITION_NAME DEFAULT
SHARING DEFAULT
EDITIONABLE DEFAULT
ORACLE_MAINTAINED DEFAULT
18 rows selected.
3.5 禁用IM列存盤
若要禁用表的IM列存盤,指定no inmemory即可,
SQL> alter table alen.t_objects no inmemory;
Table altered.
4 表空間啟用/禁用列存盤
表空間IM列存盤的啟用和禁用,也是通過inmemory和on inmemory指定,
1)創建表空間
SQL> create tablespace test01 datafile '/u01/app/oracle/oradata/ORCL/test01.dbf' size 100M default inmemory;
Tablespace created.
2)查看表空間屬性
select def_inmemory,def_inmemory_priority,def_inmemory_compression,def_inmemory_duplicate from dba_tablespaces where tablespace_name='TEST01';
3)修改表空間IM列存盤壓縮和填充優先級
SQL> alter tablespace test01 default inmemory memcompress for capacity high priority high;
Tablespace altered.
SQL> select def_inmemory,def_inmemory_priority,def_inmemory_compression,def_inmemory_duplicate from dba_tablespaces where tablespace_name='TEST01';
DEF_INME DEF_INME DEF_INMEMORY_COMP DEF_INMEMORY_
-------- -------- ----------------- -------------
ENABLED HIGH FOR CAPACITY HIGH NO DUPLICATE
以上內容便是對Oracle 12c新特性在資料庫、表、列以及表空間的IM列存盤的介紹,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2489.html
標籤:Oracle
