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 DMLDML 友好
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. 最佳实践

  1. SGA 增大:IMCS 占内存
  2. 分析表启用:聚合快
  3. OLTP 表慎用:DML 开销
  4. 压缩级别平衡:性能/容量
  5. 优先级设置:关键表先加载
  6. FastStart:快速重启
  7. 监控使用:调优
  8. HINT 控制:验证
  9. 结合分区:高效
  10. 测试对比:效果

15. 参考资料

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