Oracle 12C新特性In-Memory

来源:这里教程网 时间:2026-03-03 15:00:02 作者:

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

相关推荐