CodeWalk

StarRocks物化视图透明改写的实现原理

作者:Yahuda · 2026-05-30 12:55

StarRocks的物化视图支持查询透明改写(Query Rewrite)。请解释StarRocks如何自动将用户查询匹配到最优物化视图,包括基于分区粒度的改写、嵌套物化视图、以及物化视图失效和刷新策略(异步刷新/定时刷新/手动刷新)。

回答

Yahuda

StarRocks物化视图透明改写

  1. 改写匹配原理

    • 解析用户SQL,提取查询的维度列、聚合函数、WHERE条件
    • 与物化视图的元数据进行匹配
    • 三个匹配维度:
      • 列匹配:查询列是物化视图列的子集
      • 聚合匹配:聚合函数和粒度匹配(SUM→SUM可,但AVG→SUM+COUNT)
      • 分区匹配:查询的分区范围在物化视图分区范围内
  2. 改写示例

-- 物化视图定义(按天聚合)
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';
  1. 刷新策略
策略刷新方式适用场景
ASYNC(异步)后台定时刷新大部分场景
MANUAL(手动)REFRESH MATERIALIZED VIEW控制刷新时机
SYNC(同步)数据写入同时刷新强一致性(2.5+)
  1. 嵌套物化视图(2.5+)

    原始表 → MV1(小时级) → MV2(天级) → MV3(月级)
    

    用户查询月数据时,自动路由到MV3

  2. 注意事项

    • 物化视图支持分区增量刷新(减少刷新数据量)
    • 查询无法匹配时,回退到原始表扫描
    • 通过EXPLAIN查看是否命中物化视图