暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 12C新特性In-Memory

IT小Chen 2021-04-14
2024

Oracle 12C新特性In-Memory

 

In-Memory12C开始,在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 gets1412降到2Cost392降到16,性能提升比较明显。

查询相关信息

---V$INMEMORY_AREAV$IM_SEGMENTSV$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)

Database In-Memory Guide

Introduction to Oracle Database In-Memory


文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论