Oracle 19C In-Memory 列存储技术

来源:这里教程网 时间:2026-03-03 21:40:31 作者:

场景模拟

    有一个  sales 表存储了数亿条销售记录,需要优化复杂分析查询的性能(如聚合、全表扫描)。通过启用  In-Memory Column Store 将表或关键列加载到内存中,显著提升查询速度。

环境准备

    Oracle 19C 数据库(已启用  In-Memory 选件)。

    创建测试表表 sales 结构如下:

CREATE TABLE sales (
  sale_id      NUMBER PRIMARY KEY,
  product_id   NUMBER,
  sale_date    DATE,
  quantity     NUMBER,
  amount       NUMBER,
  region       VARCHAR2(50)
);

步骤1:配置In-Memory参数

    1.1 检查In-Memory是否启用

-- 确认INMEMORY_SIZE参数已分配(非零值)
SHOW PARAMETER INMEMORY_SIZE;
-- 若未启用,需调整参数(需重启数据库):
ALTER SYSTEM SET INMEMORY_SIZE=10G SCOPE=SPFILE;

    1.2 确认In-Memory Area状态

SELECT POOL, ALLOC_BYTES, USED_BYTES 
FROM V$INMEMORY_AREA;

步骤2:启用表的In-Memory特性

    2.1 将表  sales 加载到In-Memory列存储

-- 启用表的In-Memory,默认所有列压缩为MEMCOMPRESS FOR QUERY LOW
ALTER TABLE sales INMEMORY MEMCOMPRESS FOR QUERY LOW;
-- 可选:指定关键列使用更高压缩率(如金额和日期)
ALTER TABLE sales 
INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (amount, sale_date)
NO INMEMORY (region);  -- 不加载region列到内存

    2.2 验证In-Memory配置

SELECT TABLE_NAME, INMEMORY_COMPRESSION, INMEMORY_PRIORITY 
FROM DBA_TABLES 
WHERE TABLE_NAME = 'SALES';
-- 查看列级In-Memory设置
SELECT COLUMN_NAME, INMEMORY_COMPRESSION 
FROM DBA_IM_COLUMNS 
WHERE TABLE_NAME = 'SALES';

步骤3:手动加载数据到内存

    3.1 触发全表加载

-- 强制将表加载到In-Memory列存储
SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sales;

    3.2 监控加载进度

SELECT SEGMENT_NAME, BYTES_NOT_POPULATED, POPULATE_STATUS 
FROM V$IM_SEGMENTS 
WHERE SEGMENT_NAME = 'SALES';
-- 当POPULATE_STATUS = COMPLETED 时,表示加载完成

步骤4:执行查询验证性能

    4.1 执行分析查询(使用In-Memory)

-- 查询每个区域的总销售额
SET AUTOTRACE TRACE STATISTICS  -- 启用执行计划统计
SELECT region, SUM(amount) 
FROM sales 
GROUP BY region;

    4.2 比较性能

        未启用In-Memory时:可能走传统行存储全表扫描,耗时较长。

        启用In-Memory后:通过列存储的向量化处理,查询速度显著提升(通常快10~100倍)。

    4.3 确认是否使用In-Memory

-- 检查执行计划中的"In-Memory"操作符
EXPLAIN PLAN FOR 
SELECT region, SUM(amount) FROM sales GROUP BY region;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

输出中应包含  TABLE ACCESS INMEMORY FULL  字样。

步骤5:利用自动In-Memory优化(Oracle 19C新特性)

    Oracle 19C 引入  Automatic In-Memory (AIM),自动管理内存中对象的优先级和生命周期。

    5.1 启用AIM

-- 设置AIM级别(BASIC/ADVANCED)
ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = ADVANCED;

    5.2 监控AIM行为

-- 查看AIM自动管理的对象
SELECT OBJECT_NAME, INMEMORY_PRIORITY, AIM_STATUS 
FROM DBA_IM_SECTIONS;

新特性说明

    混合列压缩增强

            支持  MEMCOMPRESS FOR CAPACITY HIGH,更高压缩率节省内存。

           动态调整压缩级别,平衡性能与空间。

    AIM(自动In-Memory管理)

            根据访问频率自动调整内存中对象的优先级。

            自动淘汰不常用的数据,保留热数据在内存中。

    JSON和空间数据类型支持

        可在In-Memory中存储JSON字段或空间数据,加速复杂查询。

注意事项

    内存分配:确保  INMEMORY_SIZE 足够容纳频繁访问的数据。

    列选择:仅加载分析型查询所需的列,避免浪费内存。

    统计信息:定期收集统计信息以优化In-Memory执行计划。

    混合负载:In-Memory适合OLAP场景,OLTP事务仍需依赖行存储

相关推荐