欢迎光临
我们一直在努力

Oracle 12C新特性In-Memory



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",共同学习,共同成长!!!






赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。