StarRocks物化视图透明改写的实现原理
StarRocks的物化视图支持查询透明改写(Query Rewrite)。请解释StarRocks如何自动将用户查询匹配到最优物化视图,包括基于分区粒度的改写、嵌套物化视图、以及物化视图失效和刷新策略(异步刷新/定时刷新/手动刷新)。
回答
Yahuda
StarRocks物化视图透明改写:
-
改写匹配原理:
- 解析用户SQL,提取查询的维度列、聚合函数、WHERE条件
- 与物化视图的元数据进行匹配
- 三个匹配维度:
- 列匹配:查询列是物化视图列的子集
- 聚合匹配:聚合函数和粒度匹配(SUM→SUM可,但AVG→SUM+COUNT)
- 分区匹配:查询的分区范围在物化视图分区范围内
-
改写示例:
-- 物化视图定义(按天聚合)
CREATE MATERIALIZED VIEW mv_daily
REFRESH ASYNC
AS SELECT date_trunc('day', ts) AS dt, user_id, SUM(amount) AS total
FROM orders GROUP BY dt, user_id;
-- 用户查询→被自动改写到mv_daily
SELECT SUM(amount) FROM orders
WHERE ts >= '2025-01-01' AND ts < '2025-02-01';
- 刷新策略:
| 策略 | 刷新方式 | 适用场景 |
|---|---|---|
| ASYNC(异步) | 后台定时刷新 | 大部分场景 |
| MANUAL(手动) | REFRESH MATERIALIZED VIEW | 控制刷新时机 |
| SYNC(同步) | 数据写入同时刷新 | 强一致性(2.5+) |
-
嵌套物化视图(2.5+):
原始表 → MV1(小时级) → MV2(天级) → MV3(月级)用户查询月数据时,自动路由到MV3
-
注意事项:
- 物化视图支持分区增量刷新(减少刷新数据量)
- 查询无法匹配时,回退到原始表扫描
- 通过
EXPLAIN查看是否命中物化视图