本文介绍如何通过 Data Cache 预热(Warmup)将远端数据提前载入 Data Cache,以减少冷启动对查询性能的影响。本功能同时适用于存算分离 Data Cache 和数据湖 Data Cache。
前提条件
已开启 Data Cache 功能,且当前用户对目标表拥有 SELECT 权限。
适用场景
在以下场景中,建议使用 Data Cache 预热:
缓存盘容量充足:缓存盘的可用容量大于待预热的数据量。若磁盘容量不足,预热过程中新加载的数据会不断淘汰已缓存数据,无法达到预期效果。
缓存访问较为稳定:预热期间,避免出现突发大量冷查询或大规模数据写入,否则会导致预热数据被提前淘汰。
POC 性能测试:需要排除外部存储系统的 I/O 干扰,单独测试 StarRocks 查询性能时,可通过预热提前将测试数据载入缓存。
定时报表场景:业务方每天固定时间查看 BI 报表,可提前调度预热任务,保证查询性能稳定。
使用方式
StarRocks 提供 CACHE SELECT 语法实现 Data Cache 预热。CACHE SELECT 为同步操作,且一次只能对一张表进行预热。
语法如下:
CACHE SELECT <column_name> [, ...]
FROM [<catalog_name>.][<db_name>.]<table_name> [WHERE <boolean_expression>]
[PROPERTIES("verbose"="true")]参数说明:
参数 | 说明 |
| 需要缓存的列,支持使用 |
| External Catalog 名称,仅在数据湖外表分析时使用。若已通过 |
| 数据库名称。若已切换到对应数据库,可省略。 |
| 目标表名称。 |
| WHERE 子句中的过滤条件,用于指定预热范围。 |
| 当前仅支持 |
执行成功后,返回以下预热指标:
指标 | 说明 |
| 所有节点累计从 Data Cache 中读取的数据量。 |
| 所有节点累计写入 Data Cache 的数据量。 |
| 每个节点将远端数据写入 Data Cache 的平均耗时。 |
| 预热完成后整个集群 Data Cache 的空间使用率,可用于评估缓存空间是否充足。 |
预热全表数据
预热外表 lineitem 的所有数据:
CACHE SELECT * FROM hive_catalog.test_db.lineitem;按列和过滤条件预热
建议通过指定列名和 WHERE 谓词进行细粒度预热,以减少不必要的数据拉取,降低磁盘 I/O 和 CPU 消耗。
示例:预热外表指定分区中的指定列:
mysql> CACHE SELECT l_orderkey FROM hive_catalog.test_db.lineitem WHERE l_shipdate='1994-10-28';
+-----------------+------------------+----------------------+-------------------+
| READ_CACHE_SIZE | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+-----------------+------------------+----------------------+-------------------+
| 957MB | 713.5MB | 3.6ms | 97.33% |
+-----------------+------------------+----------------------+-------------------+
1 row in set (9.07 sec)示例:预热存算分离内表 lineorder 中的部分列:
mysql> CACHE SELECT lo_orderkey FROM ssb.lineorder;
+-----------------+------------------+----------------------+-------------------+
| READ_CACHE_SIZE | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+-----------------+------------------+----------------------+-------------------+
| 118MB | 558.9MB | 200.6ms | 4.66% |
+-----------------+------------------+----------------------+-------------------+
1 row in set (29.88 sec)verbose 模式
默认情况下,CACHE SELECT 返回合并后的汇总指标。添加 PROPERTIES("verbose"="true") 可获取各个 BE 节点的详细指标,同时返回额外字段 AVG_READ_CACHE_TIME(每个节点在 Data Cache 命中下的平均读取耗时)。
mysql> CACHE SELECT * FROM hive_catalog.test_db.lineitem PROPERTIES("verbose"="true");
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
| IP | READ_CACHE_SIZE | AVG_READ_CACHE_TIME | WRITE_CACHE_SIZE | AVG_WRITE_CACHE_TIME | TOTAL_CACHE_USAGE |
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
| 172.26.80.233 | 376MB | 127.8micros | 0B | 0s | 3.85% |
| 172.26.80.231 | 272.5MB | 121.8micros | 20.7MB | 146.5micros | 3.91% |
| 172.26.80.232 | 355.5MB | 147.7micros | 0B | 0s | 3.91% |
+---------------+-----------------+---------------------+------------------+----------------------+-------------------+
3 rows in set (0.54 sec)CACHE SELECT 定时调度
CACHE SELECT 可与 SUBMIT TASK 结合使用,实现周期性预热。
示例:每隔 5 分钟对 lineitem 表执行一次预热:
mysql> SUBMIT TASK always_cache SCHEDULE EVERY(INTERVAL 5 MINUTE) AS CACHE SELECT l_orderkey
FROM hive_catalog.test_db.lineitem
WHERE l_shipdate='1994-10-28';
+--------------+-----------+
| TaskName | Status |
+--------------+-----------+
| always_cache | SUBMITTED |
+--------------+-----------+
1 row in set (0.03 sec)CACHE SELECT 任务管理
查看已创建的任务
SELECT * FROM default_catalog.information_schema.tasks;查看任务执行历史
SELECT * FROM default_catalog.information_schema.task_runs;EXTRA_MESSAGE 字段记录了 CACHE SELECT 的相关预热指标。
删除任务
DROP TASK <task_name>;最佳实践
场景一:POC 性能测试
通过 CACHE SELECT 提前将待测试的表数据载入 Data Cache,排除外部存储系统 I/O 干扰,获得更准确的性能基准。
场景二:BI 报表定时预热
业务方每天 8:00 查看 BI 报表,提交一个每天 7:00 执行的预热任务:
SUBMIT TASK BI SCHEDULE START('2024-02-03 07:00:00') EVERY(INTERVAL 1 DAY)
AS CACHE SELECT * FROM hive_catalog.test_db.lineitem
WHERE l_shipdate='1994-10-28';场景三:降低预热对系统的影响
通过 SUBMIT TASK 的 properties 参数指定资源组和并行度(DOP),减少预热任务对正常业务查询的影响:
SUBMIT TASK cache_select PROPERTIES("pipeline_dop"="1", "resource_group"="warmup") SCHEDULE EVERY(INTERVAL 1 DAY)
AS CACHE SELECT * FROM hive_catalog.test_db.lineitem WHERE l_shipdate>='1994-10-28';使用限制
CACHE SELECT每次只能对单张表进行预热,不支持ORDER BY、LIMIT、GROUP BY等算子。支持存算分离和存算一体架构的外表查询,支持预热远端的 TEXT、ORC、Parquet 文件。
数据湖用户可通过
SHOW BACKENDS\G或SHOW COMPUTE NODES\G查看 Data Cache 剩余容量,判断是否会触发 LRU 淘汰;存算分离用户可通过存算分离监控指标查看缓存使用情况。