应用场景
物化视图是在基表之上构建的查询逻辑并将结果持久化存储。在 StarRocks 中,物化视图对于用户是透明的,即用户发起查询的时候不需要指定物化视图的名称,而是直接查询基表,StarRocks 会决定是否从物化视图读取数据。
物化视图的使用场景有:
- 分析需求覆盖明细数据查询以及固定维度聚合查询两方面。
- 需要做对排序键前缀之外的其他列组合形式做范围条件过滤。
- 需要对明细表的任意维度做粗粒度聚合分析。
在官方文档中偶尔会看到 Rollup 这个术语,关于 Rollup 的说明可以看 Rollup 与查询,Rollup 和物化视图的关系看物化视图这篇文档。
使用方式
下面是在基表 goods_spu
之上构建的物化视图的示例:
CREATE MATERIALIZED VIEW v_brand_cnt AS
SELECT
brand_name,
COUNT(goods_id) AS cnt
FROM
goods_spu gs
GROUP BY
brand_name ;
查看物化视图的表结果。
DESC goods_spu ALL;
IndexName |IndexKeysType|Field |Type |Null|Key |Default|Extra|
-----------+-------------+----------------------------------------------+--------------+----+-----+-------+-----+
goods_spu |DUP_KEYS |goods_id |VARCHAR(32) |Yes |false| |NONE |
| |goods_name |VARCHAR(512) |Yes |false| |NONE |
| |brand_name |VARCHAR(32) |Yes |false| |NONE |
v_brand_cnt|AGG_KEYS |brand_name |VARCHAR(32) |Yes |true | | |
| |CASE WHEN `goods_id` IS NULL THEN 0 ELSE 1 END|BIGINT |No |false| |SUM |
在 IndexName 那一列有两个值:goods_spu 和 v_brand_cnt,goods_spu 是基表(展示的字段经过人工删减),v_brand_cnt 是我们创建的物化视图。
检查下面的查询是否命中物化视图。
SELECT
brand_name,
COUNT(goods_id) AS cnt
FROM
goods_spu gs
GROUP BY
brand_name ;
使用 EXPLAIN 获取到命中的结果:
Explain String |
---------------------------------------------------------------+
PLAN FRAGMENT 0 |
OUTPUT EXPRS:21: brand_name | 34: count |
PARTITION: UNPARTITIONED |
|
RESULT SINK |
|
4:EXCHANGE |
|
PLAN FRAGMENT 1 |
OUTPUT EXPRS: |
PARTITION: HASH_PARTITIONED: 21: brand_name |
|
STREAM DATA SINK |
EXCHANGE ID: 04 |
UNPARTITIONED |
|
3:AGGREGATE (merge finalize) |
| output: sum(34: count) |
| group by: 21: brand_name |
| |
2:EXCHANGE |
|
PLAN FRAGMENT 2 |
OUTPUT EXPRS: |
PARTITION: RANDOM |
|
STREAM DATA SINK |
EXCHANGE ID: 02 |
HASH_PARTITIONED: 21: brand_name |
|
1:AGGREGATE (update serialize) |
| STREAMING |
| output: sum(33: mv_count_goods_id) |
| group by: 21: brand_name |
| |
0:OlapScanNode |
TABLE: goods_spu |
PREAGGREGATION: ON |
partitions=1/1 |
rollup: v_brand_cnt |
tabletRatio=8/8 |
tabletList=10676,10680,10684,10688,10692,10696,10700,10704|
cardinality=1283994 |
avgRowSize=2.0 |
numNodes=0 |
执行计划树的 OlapScanNode 节点显示 PREAGGREGATION: ON
和 rollup: v_brand_cnt
表明使用了物化视图 v_brand_cnt 的聚合结果。
关于物化视图更加详细的使用说明,请看官方文档——物化视图。
限制条件
- 物化视图的聚合函数的参数仅支持单列,比如:sum(a+b) 不支持。
- 单表上过多的物化视图会影响导入的效率:导入数据时,物化视图和 base 表数据是同步更新的,如果一张表的物化视图表超过 10 张,则有可能导致导入速度很慢。这就像单次导入需要同时导入 10 张表数据是一样的。
- 相同列,不同聚合函数,不能同时出现在一张物化视图中,比如:select sum(a), min(a) from table 不支持。
- 物化视图的创建语句目前不支持 JOIN 和 WHERE ,也不支持 GROUP BY 的 HAVING 子句。
- 不能同时创建多个物化视图,只能等待上一个物化视图创建完成,才能创建下一个物化视图。