物化视图查询改写
本文描述了如何利用 StarRocks 的异步物化视图来改写并加速查询。
概述
StarRocks 的异步物化视图采用了主流的基于 SPJG(select-project-join-group-by)模式透明查询改写算法。在不修改查询语句的前提下,StarRocks 可以自动将在基表上的查询改写为在物化视图上的查询。通过其中包含的预计算结果,物化视图可以帮助您显著降低计算成本,并大幅加速查询执行。
基于异步物化视图的查询改写功能,在以下场景下特别有用:
-
指标预聚合
如果您需要处理高维度数据,可以使用物化视图来创建预聚合指标层。
-
宽表 Join
物化视图允许您在复杂场景下下透明加速包含大宽表 Join 的查询。
-
湖仓加速
构建基于 External Catalog 的物化视图可以轻松加速针对数据湖中数据的查询。
说明
基于 JDBC Catalog 表构建的异步物化视图暂不支持查询改写。
功能特点
StarRocks 的异步物化视图自动查询改写功能具有以下特点:
- 强数据一致性:如果基表是 StarRocks 内表,StarRocks 可以保证通过物化视图查询改写获得的结果与直接查询基表的结果一致。
- Staleness rewrite:StarRocks 支持 Staleness rewrite,即允许容忍一定程度的数据过期,以应对数据变更频繁的情况。
- 多表 Join:StarRocks 的异步物化视图支持各种类型的 Join,包括一些复杂的 Join 场景,如 View Delta Join 和 Join 派生改写,可用于加速涉及大宽表的查询场景。
- 聚合改写:StarRocks 可以改写带有聚合操作的查询,以提高报表性能。
- 嵌套物化视图:StarRocks 支持基于嵌套物化视图改写复杂查询,扩展了可改写的查询范围。
- Union 改写:您可以将 Union 改写特性与物化视图分区的生存时间(TTL)相结合,实现冷热数据的分离,允许您从物化视图查询热数据,从基表查询历史数据。
- 基于视图构建物化视图:您可以在基于视图建模的情景下加速查询。
- 基于 External Catalog 构建物化视图:您可以通过该特性加速数据湖中的查询。
- 复杂表达式改写:支持在表达式中调用函数和算术运算,满足复杂分析和计算需求。
这些特点将在以下各节中详细说明。
Join 改写
StarRocks 支持改写具有各种类型 Join 的查询,包括 Inner Join、Cross Join、Left Outer Join、Full Outer Join、Right Outer Join、Semi Join 和 Anti Join。 以下示例展示 Join 查询的改写。创建以下基表:
CREATE TABLE customer (
c_custkey INT(11) NOT NULL,
c_name VARCHAR(26) NOT NULL,
c_address VARCHAR(41) NOT NULL,
c_city VARCHAR(11) NOT NULL,
c_nation VARCHAR(16) NOT NULL,
c_region VARCHAR(13) NOT NULL,
c_phone VARCHAR(16) NOT NULL,
c_mktsegment VARCHAR(11) NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(c_custkey)
DISTRIBUTED BY HASH(c_custkey) BUCKETS 12;
CREATE TABLE lineorder (
lo_orderkey INT(11) NOT NULL,
lo_linenumber INT(11) NOT NULL,
lo_custkey INT(11) NOT NULL,
lo_partkey INT(11) NOT NULL,
lo_suppkey INT(11) NOT NULL,
lo_orderdate INT(11) NOT NULL,
lo_orderpriority VARCHAR(16) NOT NULL,
lo_shippriority INT(11) NOT NULL,
lo_quantity INT(11) NOT NULL,
lo_extendedprice INT(11) NOT NULL,
lo_ordtotalprice INT(11) NOT NULL,
lo_discount INT(11) NOT NULL,
lo_revenue INT(11) NOT NULL,
lo_supplycost INT(11) NOT NULL,
lo_tax INT(11) NOT NULL,
lo_commitdate INT(11) NOT NULL,
lo_shipmode VARCHAR(11) NOT NULL
) ENGINE=OLAP
DUPLICATE KEY(lo_orderkey)
DISTRIBUTED BY HASH(lo_orderkey) BUCKETS 48;