Oracle 12c In-Memory Column Store
Oracle 12c In-Memory Column Store
适用版本:Oracle Database 12.1.0.2+ / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
In-Memory Column Store(IMCS) 是 Oracle 12c 引入的列式存储[1]:
特点:
- 行+列双格式
- 内存列存
- OLTP+OLAP 混合
- 透明加速分析
2. 架构
SGA
├── Buffer Cache(行存)
└── In-Memory Column Store(列存)
└── 列压缩
3. 启用
3.1 设置大小
ALTER SYSTEM SET inmemory_size = 10G SCOPE=SPFILE;
-- 至少 100M
-- 重启
SHUTDOWN IMMEDIATE;
STARTUP;
3.2 查看大小
SHOW PARAMETER inmemory_size;
4. 启用表
4.1 整表
ALTER TABLE sales INMEMORY;
4.2 指定列
ALTER TABLE sales INMEMORY (sale_date, amount, product_id);
4.3 子分区
ALTER TABLE sales INMEMORY
MEMCOMPRESS FOR QUERY
PRIORITY CRITICAL;
4.4 表空间
ALTER TABLESPACE users DEFAULT INMEMORY;
5. 压缩级别
| 级别 | 说明 |
|---|---|
| NO MEMCOMPRESS | 不压缩 |
| MEMCOMPRESS FOR DML | DML 友好 |
| MEMCOMPRESS FOR QUERY LOW | 查询低(默认) |
| MEMCOMPRESS FOR QUERY HIGH | 查询高 |
| MEMCOMPRESS FOR CAPACITY LOW | 容量低 |
| MEMCOMPRESS FOR CAPACITY HIGH | 容量高 |
ALTER TABLE sales INMEMORY MEMCOMPRESS FOR QUERY HIGH;
6. 优先级
ALTER TABLE sales INMEMORY PRIORITY CRITICAL;
-- CRITICAL > HIGH > MEDIUM > LOW
7. 加载
7.1 自动
-- 查询时加载
SELECT COUNT(*) FROM sales;
7.2 手动
EXEC DBMS_INMEMORY.POPULATE('SCOTT', 'SALES');
EXEC DBMS_INMEMORY.REPOPULATE('SCOTT', 'SALES');
7.3 查看
SELECT
segment_name,
populate_status,
bytes_not_populated,
inmemory_size
FROM v$im_segments;
8. 查询
8.1 自动使用
SELECT SUM(amount) FROM sales WHERE sale_date >= '2026-01-01';
-- CBO 自动选择 IMCS
8.2 验证
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- TABLE ACCESS INMEMORY FULL
8.3 HINT
SELECT /*+ INMEMORY */ * FROM sales;
SELECT /*+ NO_INMEMORY */ * FROM sales;
9. 双格式优势
9.1 OLTP
- Buffer Cache 行存
- 高并发 DML
9.2 OLAP
- IMCS 列存
- 聚合分析快
9.3 自动同步
- DML 实时同步
- 一致性保证
10. 应用场景
10.1 分析查询
-- 聚合
SELECT product_id, SUM(amount), AVG(amount), COUNT(*)
FROM sales
WHERE sale_date BETWEEN '2026-01-01' AND '2026-12-31'
GROUP BY product_id;
10.2 WHERE 过滤
SELECT * FROM sales WHERE customer_id = 100 AND sale_date >= '2026-01-01';
10.3 JOIN
SELECT s.*, p.product_name
FROM sales s, products p
WHERE s.product_id = p.id
AND s.sale_date >= '2026-01-01';
11. IM FastStart
11.1 持久化
-- 11.2.4+
-- IMCS 数据持久化到磁盘
-- 重启快速加载
ALTER TABLESPACE im_fs ADD DATAFILE '...' SIZE 10G;
EXEC DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE('IM_FS');
12. 监控
12.1 使用率
SELECT
name,
populate_status,
bytes / 1024 / 1024 AS mb,
inmemory_size / 1024 / 1024 AS im_mb
FROM v$im_segments;
12.2 统计
SELECT name, value FROM v$sysstat WHERE name LIKE '%IM%';
12.3 查询使用
SELECT sql_text, inmemory_operations
FROM v$sql WHERE inmemory_operations > 0;
13. 常见坑与排错
13.1 IMCS 不生效
-- 1. 检查大小
SHOW PARAMETER inmemory_size
-- 2. 检查 INMEMORY 属性
SELECT table_name, inmemory FROM user_tables WHERE table_name = 'SALES';
-- 3. 检查 populate_status
SELECT * FROM v$im_segments;
13.2 内存不足
-- 1. 增大 inmemory_size
ALTER SYSTEM SET inmemory_size = 20G SCOPE=SPFILE;
-- 2. 选择性加载
ALTER TABLE sales INMEMORY (sale_date, amount);
13.3 DML 慢
-- 1. 选择 DML 友好压缩
ALTER TABLE sales INMEMORY MEMCOMPRESS FOR DML;
-- 2. 关键 OLTP 表不用 IM
14. 最佳实践
- SGA 增大:IMCS 占内存
- 分析表启用:聚合快
- OLTP 表慎用:DML 开销
- 压缩级别平衡:性能/容量
- 优先级设置:关键表先加载
- FastStart:快速重启
- 监控使用:调优
- HINT 控制:验证
- 结合分区:高效
- 测试对比:效果
15. 参考资料
[1] Oracle Database In-Memory Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/inmem/