oracle in-memory 是12.1.0.2+企业版的列式内存加速特性,需许可支持;配置inmemory_size和内存目标参数后,通过alter table inmemory标记对象并触发查询加载,验证执行计划出现table access inmemory full且physical reads为0。

Oracle In-Memory 不是“内存用户测试”,而是数据库级的列式内存加速特性,面向分析型(OLAP)查询优化。它不改变应用逻辑,也不需要专门创建“内存用户”,而是通过配置参数、标记对象、触发加载三步完成启用。
确认基础环境是否就绪
In-Memory 是 Oracle 12.1.0.2 及以上企业版内置功能,无需额外安装。但必须满足:
- 数据库版本 ≥ 12.1.0.2,且为 Enterprise Edition
- 检查许可:需单独购买 In-Memory Option 许可(非免费)
- 运行
SELECT * FROM v$option WHERE parameter = 'In-Memory Column Store';,返回 TRUE 表示组件可用 - 确认当前实例未使用隐含参数禁用该特性(如
_inmemory_disabled=TRUE)
核心参数配置(需重启生效)
关键参数只有两个,但顺序和依赖关系不能错:
- 先设
INMEMORY_SIZE:最小值 100MB,建议从 512MB 起步
→ALTER SYSTEM SET INMEMORY_SIZE = 1G SCOPE=SPFILE; - 再调
SGA_TARGET或MEMORY_TARGET:确保总内存足够容纳 IM 区域
→ 若报ORA-00838,说明 MEMORY_TARGET 过小,需同步调大(如设为 ≥ 1.2G) -
注意:12.2+ 支持动态扩容(
ALTER SYSTEM SET INMEMORY_SIZE=2G),但缩容仍需重启
标记表/列并触发加载
设置参数只是分配内存空间,真正启用要靠 DDL 标记 + 查询触发:
- 启用整张表:
ALTER TABLE sales INMEMORY; - 只加载部分列(省内存):
ALTER TABLE sales INMEMORY (prod_id, amount) NO INMEMORY (cust_name, remarks); - 启用后不会立刻加载,首次执行全表扫描类查询(如
SELECT COUNT(*) FROM sales)才会触发填充 - 查加载状态:
SELECT OWNER, SEGMENT_NAME, POPULATE_STATUS FROM GV$IM_SEGMENTS;,状态为 DONE 即成功
验证效果与常见避坑
启用后重点看执行计划和物理读变化:
- 分析类 SQL 应出现 TABLE ACCESS INMEMORY FULL,且 physical reads = 0
- RAC 环境下默认数据分散在各节点,若需本地化访问,加
DUPLICATE:ALTER TABLE sales INMEMORY DISTRIBUTE AUTO;或DUPLICATE - 避免把大宽表全字段加载;优先选高频聚合字段(如时间、地区、产品 ID、金额)
- 系统表(SYS 用户下)、SYSTEM/SYSAUX 表空间对象默认不支持,需隐含参数
_inmemory_enable_sys=TRUE(不推荐生产启用)











