Oracle Database In-Memory 详解

Oracle Database In-Memory 详解

适用版本:Oracle Database 12.1.0.2 / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Database In-Memory (IM) 列式存储加速分析查询[1]:

详细见:Oracle 12c In-Memory Column Store


2. 架构

2.1 双格式

- 行式(默认):OLTP
- 列式(IM):分析
- 自动同步
- 透明

2.2 IM Column Store

- SGA 中的列式存储
- In-Memory Area
- 压缩
- 优化扫描

3. 配置

3.1 启用

ALTER SYSTEM SET inmemory_size = 4G SCOPE=SPFILE;
SHUTDOWN IMMEDIATE;
STARTUP;

3.2 表

ALTER TABLE sales INMEMORY;
ALTER TABLE sales INMEMORY MEMCOMPRESS FOR QUERY;
ALTER TABLE sales INMEMORY PRIORITY CRITICAL;

3.3 表空间

ALTER TABLESPACE users INMEMORY;

3.4 列

ALTER TABLE sales INMEMORY (id, sale_date, amount) 
  NO INMEMORY (description);

4. 压缩

4.1 选项

- NO MEMCOMPRESS:不压缩
- MEMCOMPRESS FOR DML:DML 友好
- MEMCOMPRESS FOR QUERY LOW:查询低
- MEMCOMPRESS FOR QUERY HIGH:查询高(默认)
- MEMCOMPRESS FOR CAPACITY LOW:容量低
- MEMCOMPRESS FOR CAPACITY HIGH:容量高

4.2 选择

- DML:DML 友好
- 查询:QUERY
- 容量:CAPACITY

5. 优先级

- LOW
- MEDIUM
- HIGH
- CRITICAL
- NONE(默认)
ALTER TABLE sales INMEMORY PRIORITY CRITICAL;

6. 查看

6.1 视图

SELECT * FROM v$inmemory_area;
SELECT * FROM v$im_segments;
SELECT * FROM v$im_column_level;

6.2 状态

SELECT segment_name, populate_status, bytes, inmemory_size
FROM v$im_segments;

7. 装载

7.1 自动

- 首次访问
- 后台进程
- 优先级

7.2 手动

EXEC DBMS_INMEMORY.POPULATE('SCOTT', 'SALES');
EXEC DBMS_INMEMORY.REPOPULATE('SCOTT', 'SALES');

7.3 优先级

- CRITICAL:立即
- HIGH:尽快
- MEDIUM:稍后
- LOW:空闲时

8. 查询

8.1 执行计划

EXPLAIN PLAN FOR SELECT * FROM sales WHERE amount > 1000;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY));
-- 应看到 TABLE ACCESS INMEMORY FULL

8.2 Hint

SELECT /*+ INMEMORY */ * FROM sales WHERE ...;
SELECT /*+ NO_INMEMORY */ * FROM sales WHERE ...;

8.3 性能

- 列扫描
- 压缩
- SIMD
- 聚合加速

9. DML

9.1 支持

- INSERT/UPDATE/DELETE
- 自动同步
- 行列双写

9.2 性能影响

- DML 轻微开销
- 双写
- 监控

10. 应用场景

10.1 OLAP

- 分析查询
- 聚合
- 扫描
- 大表

10.2 混合

- OLTP + OLAP
- 行式 + 列式
- 透明

10.3 报表

- 实时报表
- 复杂分析
- 快速

11. 性能

11.1 优势

- 列扫描快
- 压缩
- SIMD
- 内存

11.2 限制

- 内存需求
- DML 开销
- 装载时间

12. 监控

12.1 使用

SELECT name, value FROM v$inmemory_area;
SELECT * FROM v$im_segments;
SELECT * FROM v$im_sysdatastats;

12.2 性能

SELECT sql_id, executions, buffer_gets, 
       inmemory_col_scans, inmemory_row_scans
FROM v$sql
WHERE inmemory_col_scans > 0
ORDER BY inmemory_col_scans DESC;

13. 常见问题

13.1 未使用 IM

- 未启用
- 未装载
- 检查 populate_status
- 手动 POPULATE

13.2 内存不足

- inmemory_size
- 增加
- 选择性启用

13.3 DML 慢

- 双写开销
- 评估
- MEMCOMPRESS FOR DML

14. 最佳实践

  1. 内存充足:inmemory_size
  2. 选择性启用:大表
  3. 优先级:关键表
  4. 压缩:场景
  5. Hint:测试
  6. 监控:使用
  7. 装载:手动
  8. 测试:性能
  9. 文档:配置
  10. 演练:定期

15. 参考资料

[1] Oracle Database In-Memory Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/