场景模拟
有一个
sales 表存储了数亿条销售记录,需要优化复杂分析查询的性能(如聚合、全表扫描)。通过启用
In-Memory Column Store 将表或关键列加载到内存中,显著提升查询速度。
环境准备
Oracle 19C 数据库(已启用 In-Memory 选件)。
创建测试表表
sales 结构如下:
CREATE TABLE sales ( sale_id NUMBER PRIMARY KEY, product_id NUMBER, sale_date DATE, quantity NUMBER, amount NUMBER, region VARCHAR2(50) );
步骤1:配置In-Memory参数
1.1 检查In-Memory是否启用
-- 确认INMEMORY_SIZE参数已分配(非零值) SHOW PARAMETER INMEMORY_SIZE; -- 若未启用,需调整参数(需重启数据库): ALTER SYSTEM SET INMEMORY_SIZE=10G SCOPE=SPFILE;
1.2 确认In-Memory Area状态
SELECT POOL, ALLOC_BYTES, USED_BYTES FROM V$INMEMORY_AREA;
步骤2:启用表的In-Memory特性
2.1 将表
sales 加载到In-Memory列存储
-- 启用表的In-Memory,默认所有列压缩为MEMCOMPRESS FOR QUERY LOW ALTER TABLE sales INMEMORY MEMCOMPRESS FOR QUERY LOW; -- 可选:指定关键列使用更高压缩率(如金额和日期) ALTER TABLE sales INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (amount, sale_date) NO INMEMORY (region); -- 不加载region列到内存
2.2 验证In-Memory配置
SELECT TABLE_NAME, INMEMORY_COMPRESSION, INMEMORY_PRIORITY FROM DBA_TABLES WHERE TABLE_NAME = 'SALES'; -- 查看列级In-Memory设置 SELECT COLUMN_NAME, INMEMORY_COMPRESSION FROM DBA_IM_COLUMNS WHERE TABLE_NAME = 'SALES';
步骤3:手动加载数据到内存
3.1 触发全表加载
-- 强制将表加载到In-Memory列存储 SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sales;
3.2 监控加载进度
SELECT SEGMENT_NAME, BYTES_NOT_POPULATED, POPULATE_STATUS FROM V$IM_SEGMENTS WHERE SEGMENT_NAME = 'SALES'; -- 当POPULATE_STATUS = COMPLETED 时,表示加载完成
步骤4:执行查询验证性能
4.1 执行分析查询(使用In-Memory)
-- 查询每个区域的总销售额 SET AUTOTRACE TRACE STATISTICS -- 启用执行计划统计 SELECT region, SUM(amount) FROM sales GROUP BY region;
4.2 比较性能
未启用In-Memory时:可能走传统行存储全表扫描,耗时较长。
启用In-Memory后:通过列存储的向量化处理,查询速度显著提升(通常快10~100倍)。
4.3 确认是否使用In-Memory
-- 检查执行计划中的"In-Memory"操作符 EXPLAIN PLAN FOR SELECT region, SUM(amount) FROM sales GROUP BY region; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
输出中应包含
TABLE ACCESS INMEMORY FULL
字样。
步骤5:利用自动In-Memory优化(Oracle 19C新特性)
Oracle 19C 引入 Automatic In-Memory (AIM),自动管理内存中对象的优先级和生命周期。
5.1 启用AIM
-- 设置AIM级别(BASIC/ADVANCED) ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = ADVANCED;
5.2 监控AIM行为
-- 查看AIM自动管理的对象 SELECT OBJECT_NAME, INMEMORY_PRIORITY, AIM_STATUS FROM DBA_IM_SECTIONS;
新特性说明
混合列压缩增强:
支持
MEMCOMPRESS FOR CAPACITY HIGH,更高压缩率节省内存。
动态调整压缩级别,平衡性能与空间。
AIM(自动In-Memory管理):
根据访问频率自动调整内存中对象的优先级。
自动淘汰不常用的数据,保留热数据在内存中。
JSON和空间数据类型支持:
可在In-Memory中存储JSON字段或空间数据,加速复杂查询。
注意事项
内存分配:确保
INMEMORY_SIZE 足够容纳频繁访问的数据。
列选择:仅加载分析型查询所需的列,避免浪费内存。
统计信息:定期收集统计信息以优化In-Memory执行计划。
混合负载:In-Memory适合OLAP场景,OLTP事务仍需依赖行存储
