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
时,要及时收集统计信息
否则执行计划里的信息是不准确的。
详细信息可以参考官方文档
https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/intro-to-in-memory-column-store.html#GUID-BFA53515-7643-41E5-A296-654AB4A9F9E7
Database In-Memory Guide
Introduction to Oracle Database In-Memory
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!