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. 最佳实践
- 内存充足:inmemory_size
- 选择性启用:大表
- 优先级:关键表
- 压缩:场景
- Hint:测试
- 监控:使用
- 装载:手动
- 测试:性能
- 文档:配置
- 演练:定期
15. 参考资料
[1] Oracle Database In-Memory Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/