缓存预热功能可以根据您制定的缓存计划定时地把指定的列存数据从远端OSS存储中拉取到列存只读实例的缓存中,提高计算节点执行分析型查询时的缓存命中率,从而为您提供快速且稳定的查询体验。
基于存算分离架构设计的PolarDB-X列存查询引擎,在执行分析型查询时采用智能缓存策略。计算节点优先检测本地缓存中的列存索引数据命中状态,当发生缓存未命中情形,系统将自动从远端OSS对象存储服务拉取所需列存数据到列存只读节点。为优化查询体验,引擎配备多级缓存管理机制,采用分层递进的数据加载策略,仅当上层缓存未命中时,才会逐级向底层存储发起数据请求,并在获取数据后主动回填至上层缓存空间。缓存预热功能作为缓存管理体系的战略补充,通过引入主动预加载机制,有效解决了冷启动阶段的性能瓶颈问题。这种双模协同机制(被动响应+主动预载)显著增强了系统应对复杂查询场景的能力,为海量数据分析提供持续稳定的高性能保障。
缓存机制对比详解:
适用于稳定的业务查询访问,不适用于即席查询(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表达式格式如下: 特殊字符说明: |
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';使用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 |
通过查询视图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最佳实践
WARMUP('* /2 * * * *')
SELECT col1, col2, col3... FROM your_table;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';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;WARMUP('*/5 1-5 * * *')
SELECT * FROM lineitem;



