Oracle 12C新特性In-Memory
In-Memory是12C开始,在SGA中新增加的内存区域,可以实现表数据按列存储;
In-Memory并没有取代传统的Buffer Cache,二者并存在SGA中。

SGA是动态区域,In-Memory空间大小是静态的,需要DBA手动维护。

列式存储数据和行式存储数据各有优缺点,适用场景不同。
列式存储在访问多行、少列情况下性能更优。


下面启用inmemory,进行性能测试。
一 数据库版本为19C(相当于12.2.0.3版本)
SQL> select banner_full from v$version;
BANNER_FULL
---------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
二 查看inmemory是否启用
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 0
三 创建测试数据
SQL> conn cjc/cjc@cjcpdb
SQL> create table t1 as select * from dba_objects;
SQL> select count(*) from t1;
COUNT(*)
----------
72482
四 启用in-memory(实例级别)
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 0
SQL> alter system set inmemory_size=300M scope=spfile;
SQL> shutdown immediate
SQL> startup
ORACLE instance started.
Total System Global Area 1287650440 bytes
Fixed Size 9145480 bytes
Variable Size 759169024 bytes
Database Buffers 201326592 bytes
Redo Buffers 3436544 bytes
In-Memory Area 314572800 bytes
Database mounted.
Database opened.
SQL> show parameter inmemory_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 300M
五 性能对比
5.1 收集T1表统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('CJC','T1',estimate_percent=>100,CASCADE=> TRUE);
PL/SQL procedure successfully completed.
查看执行计划
SQL> set autotrace on

5.2 对表t1启用inmemory
SQL> conn sys/oracle@cjcpdb as sysdba
Connected.
SQL> alter table cjc.t1 inmemory;
---禁用alter table cjc.t1 no inmemory;
5.3 收集统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('CJC','T1',estimate_percent=>100,CASCADE=> TRUE);
5.4 查看执行计划
SQL> set autotrace on
SQL> select count(object_id) from t1;
COUNT(OBJECT_ID)
----------------
72481

T1表启用inmemory后,consistent gets由1412降到2,Cost由392降到16,性能提升比较明显。
六 查询相关信息
---V$INMEMORY_AREA、V$IM_SEGMENTS、V$IM_COLUMN_LEVEL
SELECT NAME, VALUE (1024 * 1024 * 1024) "SIZE_IN_GB"
FROM V$SGA
WHERE NAME LIKE '%Mem%';

SELECT POOL,
TRUNC(ALLOC_BYTES / (1024 * 1024 * 1024), 2) "ALLOC_GB",
TRUNC(USED_BYTES / (1024 * 1024 * 1024), 2) "USED_GB",
POPULATE_STATUS
FROM V$INMEMORY_AREA;

SELECT OWNER,
SEGMENT_NAME,
bytes,
INMEMORY_SIZE,
POPULATE_STATUS,
BYTES_NOT_POPULATED
FROM V$IM_SEGMENTS;

SELECT table_name,
segment_column_id,
column_name,
inmemory_compression
FROM v$im_column_level;

七 注意事项
1 inmemory_size不能小于100M
SQL> startup
ORA-64353: in-memory area size cannot be less than 100MB
2 指定表在启用或禁用inmemory时,要及时收集统计信息
否则执行计划里的信息是不准确的。
---详细信息可以参考官方文档(docs.oracle.com)




