数据缓存(Data Cache)

更新时间:
复制 MD 格式

AnalyticDB PostgreSQLBeam存储引擎提供数据缓存(Data Cache)功能,用于缓存已解压的列存数据块,在索引点查、嵌套循环连接等场景下显著提升查询性能。

功能介绍

AnalyticDB PostgreSQLBeam存储引擎提供数据缓存(Data Cache)功能,用于缓存已解压的列存数据块。在索引点查、嵌套循环连接等需要重复读取相同数据块的场景下,Data Cache可以避免重复解压,显著提升查询性能。

使用限制

  • 目前Data Cache仅对索引扫描场景生效,其他扫描方式(如全表扫描、SeqScan)暂不支持。

  • v7.3.0.x 版本以上为稳定版,默认配置大小128MB, 如果需要调整大小,请提交工单联系技术支持处理。

工作原理

Beam存储引擎以列存形式存储,当同一数据块被多次访问时(如索引点查回表),重复解压会消耗大量CPU时间。Data Cache在共享内存中开辟一块区域,缓存已解压的数据块。后续访问同一数据块时直接从缓存读取,跳过解压步骤。

会话级参数

参数

默认值

说明

beam_session_enable_decompressed_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

注意事项

  1. 仅索引扫描生效:目前Data Cache仅对索引扫描(Index Scan / Bitmap Scan)场景有效,全表扫描(SeqScan)等其他扫描方式暂不支持。

  2. 默认关闭:该参数默认off,仅在有明确收益的索引重复读场景下按需开启。

  3. 会话级别:SET仅对当前会话生效,断开连接后自动恢复默认值。

  4. 不适合全表扫描:大范围扫描场景下缓存命中率低,且当前不支持,不建议开启。