列存索引缓存预热

更新时间:2025-03-11 08:44:32

缓存预热功能可以根据您制定的缓存计划定时地把指定的列存数据从远端OSS存储中拉取到列存只读实例的缓存中,提高计算节点执行分析型查询时的缓存命中率,从而为您提供快速且稳定的查询体验。

功能介绍

基于存算分离架构设计的PolarDB-X列存查询引擎,在执行分析型查询时采用智能缓存策略。计算节点优先检测本地缓存中的列存索引数据命中状态,当发生缓存未命中情形,系统将自动从远端OSS对象存储服务拉取所需列存数据到列存只读节点。为优化查询体验,引擎配备多级缓存管理机制,采用分层递进的数据加载策略,仅当上层缓存未命中时,才会逐级向底层存储发起数据请求,并在获取数据后主动回填至上层缓存空间。缓存预热功能作为缓存管理体系的战略补充,通过引入主动预加载机制,有效解决了冷启动阶段的性能瓶颈问题。这种双模协同机制(被动响应+主动预载)显著增强了系统应对复杂查询场景的能力,为海量数据分析提供持续稳定的高性能保障。

缓存机制对比详解:

  • 缓存管理(被动模式):

    • 动态填充机制:通过查询驱动的数据加载方式。

    • 响应式架构:依据实际查询需求触发数据分层缓存。

    • 渐进优化:随着查询频次提升自然形成热点数据缓存。

  • 缓存预热(主动模式):

    • 预加载机制:通过WARMUP语句预先载入目标数据。

    • 前瞻性优化:主动构建缓存内容以应对预期查询。

    • 性能保障:规避首次查询时的远端I/O延迟风险。

注意事项

  • 仅支持在列存只读实例,或者在包含列存只读实例的主实例上执行。在主实例执行时,会将WARMUP语句转发至列存只读实例执行。

  • WARMUP语句支持所有合法的SQL查询语句;

  • 为了提升预热性能,WARMUP并不会执行全部的SQL查询流程,而是仅对SQL涉及到的数据范围执行数据拉取过程。

  • WARMUP预热的缓存数据,也受到列存数据缓存的统一管理,仍然按照缓存淘汰规则进行管理。

  • 为了防止同一时间有大量预热语句同时执行,造成实例负载压力,不同WARMUP定时任务如果在执行时发生时间冲突,则会按照发起时间排队依次执行。

  • 在使用 WARMUP 时,确保提供有效的选择查询,以便在预热后能够正确地执行相应的操作。

适用场景

适用于稳定的业务查询访问,不适用于即席查询(Ad Hoc,非预先规划、临时发起的查询)。

语法

WARMUP [cron_expression]
SELECT
    select_expr [, select_expr] ...
    [FROM table_references]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... ]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

cron_expression:
    ('cron_string') | <empty>

select_expr:
    column_name
  | aggregate_function(column_name)
  | column_name AS alias_name
  | expression
说明

缓存预热语法支持多语句,将多个预热SQL集中在一条WARMUP语句中执行,多个SQL之间使用大括号隔开:

WARMUP [cron_expression]
{SELECT ...}
{SELECT ...}
{SELECT ...};

参数说明:

名称

是否必选

类型

说明

名称

是否必选

类型

说明

WARMUP

-

-

缓存预热关键字。表示执行预热操作。

cron_expression

非必选

字符串

用于定义周期性预热的计划表达式。支持标准的CRON表达式格式(Linux crontab定时任务规则)。如果不提供此参数,则只立即执行一次性缓存预热。具体操作,请参见示例

CRON表达式格式如下:

  • 第一个字段(分钟):0-59之间的任何值。

  • 第二个字段(小时):0-23之间的任何值。

  • 第三个字段(日):1-31之间的任何值。

  • 第四个字段(月):1-12之间的任何值,或使用英文缩写JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC。

  • 第五个字段(星期几):0-7之间的任何值,其中07都代表星期日,或者使用英文缩写SUN、MON、TUE、WED、THU、FRI、SAT。

特殊字符说明:

  • *:匹配所有值(如 * * * * * 表示每分钟执行)

  • ,:枚举多个值(如 3,15 * * * * 表示每小时第315分钟执行)

  • -:指定范围(如 0 9-17 * * * 表示9点到17点每小时执行)

  • /:步长间隔(如 */2 * * * * 表示每2分钟执行)

  • ?:仅在日期/星期字段使用,表示不指定具体值

  • L:最后一天(如 0 0 L * * 表示每月最后一天执行)

select_expr

必选

-

定义要选择的列或计算表达式。可以是列名、聚合函数、别名或其他计算表达式。

FROM table_references

必选

-

指定要查询的数据表。

WHERE where_condition

非必选

-

定义过滤条件,限制查询结果。

GROUP BY

非必选

-

指定结果集分组的列。

HAVING where_condition

非必选

-

对分组后的结果进行过滤。

ORDER BY

非必选

-

定义结果集的排序方式。

LIMIT

非必选

-

限制查询结果的行数或定义偏移量。

示例

执行WARMUP语句时,如果语句不包含CRON表达式,则会立即执行一次预热。如果包含CRON表达式,则会按CRON表达式所指示的执行周期,进行定时预热。

立即预热

使用TPC-H 100 GB测试集作为用例,如何按照TPC-H测试,请参见TPC-H测试。以下示例会立即预热lineitem表中的所有数据:

WARMUP SELECT * FROM lineitem;

3分钟预热

使用CRON表达式,每3分钟执行一次预热(满足WHERE条件的数据),示例如下:

WARMUP('*/3 * * * *') 
SELECT * 
FROM lineitem 
WHERE l_shipdate > '2024-09-01';

每天早上8点预热

使用CRON表达式,每天早上8点执行一次预热(JOIN查询涉及的数据),示例如下:

WARMUP('0 8 * * *') 
SELECT * 
FROM lineitem, part
WHERE l_partkey = p_partkey;

时间窗口预热

使用CRON表达式,每天凌晨1点到5点,每5分钟发起一次预热(JOIN查询涉及的数据),示例如下:

WARMUP('*/5 1-5 * * *') 
SELECT * 
FROM lineitem, part
WHERE l_partkey = p_partkey;

预热任务管理

查看定时预热任务信息

通过查询视图information_schema.columnar_warmup可以获取当前生效的所有定时预热任务。非定时WARMUP语句(不带CRON表达式)不被包含在内。下列示例用于查看库database1中的所有定时预热任务。

SELECT * FROM information_schema.columnar_warmup WHERE schema_name = 'database1';

字段说明:

名称

说明

名称

说明

ID

主键。

TASK_ID

任务ID。

SCHEMA_NAME

库名。

CREATE_TIME

创建时间。

CRON_EXPR

CRON表达式。

SQL_DEF

预热使用的SQL语句。

STATUS

  • VALID:正常状态,定时调度。

  • INVALID:非法状态,不再调度。可能由于列变更导致预热SQL语句失效。

查看历史执行信息

通过查询视图information_schema.warmup_execution_logs可以获取预热语句执行历史信息。以下示例查询近2天内的预热语句执行信息:

SELECT * FROM information_schema.warmup_execution_logs WHERE start_time >= NOW() - INTERVAL 2 DAY;

字段说明:

名称

说明

名称

说明

ID

主键。

TASK_ID

任务ID。

TRACE_ID

预热SQL执行记录编号。

START_TIME

预热执行时间。

FINISH_TIME

预热结束时间。

TIME_COST

预热耗时,单位毫秒(ms)。

IO_MESSAGE

IO信息汇总。

删除预热任务

通过information_schema.columnar_warmup视图找到需要清理的预热任务的TASK_ID,执行下列语句进行预热任务删除:

WARMUP DELETE <TASK_ID>

也可以通过下列语句,删除所有预热任务:

WARMUP DELETE ALL

暂停/恢复预热任务

通过information_schema.columnar_warmup视图找到需要清理的预热任务的TASK_ID,执行下列语句将指定任务暂停:

WARMUP SUSPEND <TASK_ID>

也可以通过下列语句,暂停所有预热任务:

WARMUP SUSPEND ALL

执行下列语句进行任务恢复:

WARMUP RESUME <TASK_ID>

也可以通过下列语句,恢复所有预热任务:

WARMUP RESUME ALL

最佳实践

  • 业务写入流量较高,且对于查询延迟较为敏感,可以安排每2分钟对目标表的常用列进行周期性预热。执行如下语句,可以选择特定的列每2分钟进行预热:

    WARMUP('* /2 * * * *')
    SELECT col1, col2, col3... FROM your_table;
  • 业务每天22:00需要对一天的业务数据进行分析查询,可以安排每天21:30使用分析型查询SQL对于涉及的业务数据进行预热,例如:

    WARMUP('30 21 * * *')
    SELECT col1, col2, col3 ...
    FROM table1 
    LEFT JOIN table2 ON table1.id1 = table2.id2
    LEFT JOIN table3 ON table1.id1 = table3.id3
    WHERE table1.col_date > '2024-01-01';
  • 进行专业性能测试前,例如TPC-H,ClickBench,可以对所有表进行一次性预热。执行如下SQLTPC-H的表进行了一次性预热:

    WARMUP SELECT * FROM lineitem;
    WARMUP SELECT * FROM orders;
    WARMUP SELECT * FROM customer;
    WARMUP SELECT * FROM part;
    WARMUP SELECT * FROM partsupp;
    WARMUP SELECT * FROM supplier;
    WARMUP SELECT * FROM region;
    WARMUP SELECT * FROM nation;
  • 每天选择运维窗口01:00 - 05:00执行预热,每五分钟一次。

    WARMUP('*/5 1-5 * * *')
    SELECT * FROM lineitem;
  • 本页导读 (1)
  • 功能介绍
  • 注意事项
  • 适用场景
  • 语法
  • 示例
  • 立即预热
  • 每3分钟预热
  • 每天早上8点预热
  • 时间窗口预热
  • 预热任务管理
  • 查看定时预热任务信息
  • 查看历史执行信息
  • 删除预热任务
  • 暂停/恢复预热任务
  • 最佳实践

点击开启售前

在线咨询服务