数据缓存(Data Cache)
AnalyticDB PostgreSQL版Beam存储引擎提供数据缓存(Data Cache)功能,用于缓存已解压的列存数据块,在索引点查、嵌套循环连接等场景下显著提升查询性能。
功能介绍
AnalyticDB PostgreSQL版Beam存储引擎提供数据缓存(Data Cache)功能,用于缓存已解压的列存数据块。在索引点查、嵌套循环连接等需要重复读取相同数据块的场景下,Data Cache可以避免重复解压,显著提升查询性能。
使用限制
目前Data Cache仅对索引扫描场景生效,其他扫描方式(如全表扫描、SeqScan)暂不支持。
v7.3.0.x 版本以上为稳定版,默认配置大小128MB, 如果需要调整大小,请提交工单联系技术支持处理。
工作原理
Beam存储引擎以列存形式存储,当同一数据块被多次访问时(如索引点查回表),重复解压会消耗大量CPU时间。Data Cache在共享内存中开辟一块区域,缓存已解压的数据块。后续访问同一数据块时直接从缓存读取,跳过解压步骤。
会话级参数
参数 | 默认值 | 说明 |
| off | 会话级开关。设为on后该会话的索引扫描查询走Data Cache路径,已解压的数据块会被缓存,后续访问直接从缓存读取。 |
使用方法
会话级启用
在当前会话中启用Data Cache:
-- 在当前会话中启用 Data Cache
SET beam_session_enable_decompressed_cache TO on;
-- 执行查询,索引扫描重复访问的数据块将被缓存
SELECT * FROM orders WHERE order_id IN (1001, 1002, 1003);
-- 用完关闭,避免影响其他查询
SET beam_session_enable_decompressed_cache TO off;会话级关闭
SET beam_session_enable_decompressed_cache TO off;使用场景
前提条件:以下场景均需通过索引扫描(Index Scan / Bitmap Scan)访问数据,Data Cache才能生效。全表扫描场景不生效。
场景一:嵌套循环连接(Nested Loop Join)
特点:内表通过索引被外表的每一行重复扫描,同一数据块被多次解压,CPU开销大。
建议:确保内表走索引扫描,启用Data Cache避免重复解压。
SET beam_session_enable_decompressed_cache TO on;
-- 小表驱动大表,内表通过索引扫描
SELECT /*+ NestedLoop(t1 t2) */ *
FROM small_table t1
JOIN big_table t2 ON t1.key = t2.key;
-- 需确保 t2.key 上有索引,走 Index Scan场景二:索引点查(Index Point Query)
特点:通过索引频繁访问同一数据块中的不同行,每次回表都需要解压。
建议:对点查目标表启用Data Cache,缓存热点数据块。
SET beam_session_enable_decompressed_cache TO on;
-- 批量索引点查
SELECT * FROM orders WHERE order_id IN (1001, 1002, 1003, 1004, 1005);
-- 需确保 order_id 上有索引,走 Index Scan注意事项
仅索引扫描生效:目前Data Cache仅对索引扫描(Index Scan / Bitmap Scan)场景有效,全表扫描(SeqScan)等其他扫描方式暂不支持。
默认关闭:该参数默认off,仅在有明确收益的索引重复读场景下按需开启。
会话级别:SET仅对当前会话生效,断开连接后自动恢复默认值。
不适合全表扫描:大范围扫描场景下缓存命中率低,且当前不支持,不建议开启。