同步物化视图(Rollup)是SelectDB中一种轻量级的预计算加速机制。数据导入时同步更新物化视图,查询时优化器自动选择最优的物化视图进行透明改写,无需修改查询SQL即可获得数倍至数十倍的性能提升。本文介绍同步物化视图的创建、透明改写机制及典型使用场景。
什么是同步物化视图
同步物化视图本质上是基表数据的一种预聚合或列重排的物理存储结构。其核心特点:
-
实时同步:数据导入时自动同步更新,保证与基表数据一致。
-
透明改写:查询时优化器自动匹配最优的物化视图,应用层无需感知。
-
零维护:无需手动刷新,也无需担心数据不一致。
关于同步物化视图的完整语法和详细参数说明,请参见物化视图。
创建同步物化视图
通过CREATE MATERIALIZED VIEW语句创建同步物化视图。
场景一:预聚合加速
为高频聚合查询创建同步物化视图,减少查询时的计算量:
-- 原始表:明细订单表
CREATE TABLE orders (
order_date DATE,
region VARCHAR(32),
product_id INT,
amount DECIMAL(10,2),
quantity INT
) ENGINE=OLAP
DUPLICATE KEY(order_date, region, product_id)
PARTITION BY RANGE(order_date) (
PARTITION p202401 VALUES LESS THAN ('2024-02-01'),
PARTITION p202402 VALUES LESS THAN ('2024-03-01')
)
DISTRIBUTED BY HASH(order_date) BUCKETS 16;
-- 创建按地区汇总的同步物化视图
CREATE MATERIALIZED VIEW mv_region_amount
AS SELECT region, order_date, SUM(amount) AS total_amount, SUM(quantity) AS total_qty
FROM orders
GROUP BY region, order_date;
创建完成后,查询SELECT region, SUM(amount) FROM orders GROUP BY region时,优化器会自动命中该物化视图。
场景二:调整前缀索引
基表的前缀索引由Key列顺序决定。当查询条件不包含第一个Key列时,无法利用前缀索引。可以通过ALTER TABLE ADD ROLLUP调整列顺序:
-- 基表Key顺序为 (order_date, region, product_id)
-- 按 product_id 查询无法命中前缀索引
-- 创建以 product_id 为前缀的Rollup(仅调整列顺序,不含聚合)
ALTER TABLE orders ADD ROLLUP rollup_product_prefix (
product_id, order_date, region, amount, quantity
);
此后按product_id过滤的查询将自动使用该Rollup的前缀索引。
透明改写机制
优化器在生成查询计划时,自动完成以下匹配逻辑:
-
检查查询涉及的列是否被某个Rollup完全覆盖。
-
检查查询的聚合函数是否与Rollup中预聚合的函数兼容。
-
如果多个Rollup均满足条件,选择行数最少(即聚合度最高)的Rollup。
聚合函数的兼容规则:
|
查询聚合函数 |
可命中的Rollup聚合 |
|
SUM |
SUM |
|
MIN |
MIN |
|
MAX |
MAX |
|
COUNT |
SUM(Aggregate表模型中COUNT转换为SUM) |
验证透明改写
通过EXPLAIN确认查询是否命中了物化视图:
EXPLAIN SELECT region, SUM(amount) FROM orders GROUP BY region;
-- 查看输出中的 TABLE 字段
-- TABLE: orders(mv_region_amount) 表示命中了mv_region_amount
-- TABLE: orders(orders) 表示使用了基表,未命中物化视图
如果未命中预期的物化视图,常见原因:
-
查询中包含物化视图未覆盖的列。
-
聚合函数不兼容(如查询使用了COUNT DISTINCT)。
-
物化视图尚未构建完成,可通过
SHOW ALTER TABLE MATERIALIZED VIEW查看进度。
管理同步物化视图
-- 查看表上所有物化视图和Rollup
DESC orders ALL;
-- 查看同步物化视图创建进度
SHOW ALTER TABLE MATERIALIZED VIEW WHERE TableName = 'orders';
-- 删除不再需要的同步物化视图
DROP MATERIALIZED VIEW mv_region_amount ON orders;
使用限制
-
同步物化视图仅支持单表聚合,不支持多表Join。
-
同步物化视图的列必须来自基表列,支持聚合表达式但不支持复杂计算表达式。
-
创建同步物化视图期间,表仍可正常导入数据,但构建可能有延迟。
-
每个同步物化视图会占用额外的存储空间,建议根据实际查询模式有针对性地创建。
-
不支持包含REPLACE聚合类型的Value列参与聚合计算。