关于Doris的物化视图与异步物化视图

本文详细介绍了Doris中的物化视图,包括其与Mysql视图的区别,适用场景如处理重复查询和聚合操作,以及异步物化视图的原理和Join重写示例。文章还展示了如何利用物化视图进行自动查询优化,特别是异步刷新的特点和性能提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.物化视图

1.物化视图与Mysql视图的区别

  • 物化视图:物化视图是预先计算(根据定义的 SELECT 语句)并存储在 Doris 中的特殊表中的数据集。物化视图的出现主要是为了满足用户。可以分析任意维度的原始明细数据,也可以快速分析查询固定维度。
  • mysql:MySQL中的视图(View)保存的是对数据库中一个或多个表的查询定义
    概括:物化视图是存储的实际的结果数据,而mysql存储的只是查询语句

2.物化视图什么时候使用?

  • 比较耗时的操作
  • 需要重复使用的子查询

3.物化视图与Roll up对比

物化视图支持聚合函数和Aggregation模型
物化视图是roll up加强版

4.要求

其实就是抽出共性重复,因为物化视图需要消耗资源

  • 从查询语句中抽象出,多个查询共有的分组和聚合方式作为物化视图的定义。
  • 不需要给所有维度组合都创建物化视图。

5.创建结构

meterialized view

CREATE MATERIALIZED VIEW [IF NOT EXISTS] mv_name
[PARTITION BY (partition_column)]
[DISTRIBUTE BY (distribution_column)]
[PROPERTIES ("key" = "value", ...)]
AS SELECT ...
FROM base_table
[WHERE conditions]
[GROUP BY ...]
[HAVING ...];

取消

CANCEL ALTER TABLE MATERIALIZED VIEW FROM db_name.table_name

2.异步物化视图

1.介绍(官方说法,其实我也不明白)

Doris 的异步物化视图采用基于 SPJG (SELECT-PROJECT-JOIN-GROUP-BY) 模式结构信息的算法来进行透明重写。

2.join重写

查询表与物化视图的表相同,这时候会与物化视图链接,
Join重写是指查询和物化中使用的表相同时。在这种情况下,优化器将通过将物化视图的输入与查询连接或将连接放置在查询的 WHERE 子句的外层来尝试透明重写。

这种重写模式支持多表连接,并支持内连接和左连接类型。对其他类型的支持正在不断扩大。

3.官网样例

物化视图定义,基于lineitem 表

1.join重写样例

1.物化视图创建语句
CREATE MATERIALIZED VIEW mv1
BUILD IMMEDIATE REFRESH AUTO ON SCHEDULE EVERY 1 hour
DISTRIBUTED BY RANDOM BUCKETS 12
PROPERTIES ('replication_num' = '1')
AS
SELECT t1.l_linenumber,
       o_custkey,
       o_orderdate
FROM (SELECT * FROM lineitem WHERE l_linenumber > 1) t1
         LEFT OUTER JOIN orders
                         ON l_orderkey = o_orderkey;
2.视图创建sql
SELECT t1.l_linenumber,
       o_custkey,
       o_orderdate
FROM (SELECT * FROM lineitem WHERE l_linenumber > 1) t1
LEFT OUTER JOIN orders
ON l_orderkey = o_orderkey;
##  上下是一致的注意看
SELECT t1.l_linenumber,
       o_custkey,
       o_orderdate
FROM  lineitem  t1
LEFT OUTER JOIN orders
ON l_orderkey = o_orderkey;
WHERE l_linenumber > 1
3.查询语句
SELECT l_linenumber,
       o_custkey
FROM lineitem
LEFT OUTER JOIN orders
ON l_orderkey = o_orderkey
WHERE l_linenumber > 1 and o_orderdate = '2023-12-31';
4.查询join优化后(后台做到的)
select 
       l_linenumber,
       o_custkey
from mv1
where o_orderdate = '2023-12-31';

2. JOIN 派生

1.物化视图创建语句(设定为rv2吧)
SELECT
    l_shipdate, l_suppkey, o_orderdate
    sum(o_totalprice) AS sum_total,
    max(o_totalprice) AS max_total,
    min(o_totalprice) AS min_total,
    count(*) AS count_all,
    count(distinct CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END) AS bitmap_union_basic
FROM lineitem
LEFT OUTER JOIN orders ON lineitem.l_orderkey = orders.o_orderkey AND l_shipdate = o_orderdate
GROUP BY
l_shipdate,
l_suppkey,
o_orderdate;
2.查询语句
SELECT
    l_shipdate, l_suppkey, o_orderdate
    sum(o_totalprice) AS sum_total,
    max(o_totalprice) AS max_total,
    min(o_totalprice) AS min_total,
    count(*) AS count_all,
    count(distinct CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END) AS bitmap_union_basic
FROM lineitem
INNER JOIN orders ON lineitem.l_orderkey = orders.o_orderkey AND l_shipdate = o_orderdate
WHERE o_orderdate = '2023-12-11' AND l_suppkey = 3
GROUP BY
l_shipdate,
l_suppkey,
o_orderdate;
3.查询优化
select 
  l_shipdate, l_suppkey, o_orderdate
    sum(o_totalprice) AS sum_total,
    max(o_totalprice) AS max_total,
    min(o_totalprice) AS min_total,
    count(*) AS count_all,
    count(distinct CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END) AS bitmap_union_basic
from rv2
WHERE o_orderdate = '2023-12-11' AND l_suppkey = 3

3.聚合重写

1.物化视图定义(rv3)
SELECT
    l_shipdate, o_orderdate, l_partkey, l_suppkey,
    sum(o_totalprice) AS sum_total,
    max(o_totalprice) AS max_total,
    min(o_totalprice) AS min_total,
    count(*) AS count_all,
    bitmap_union(to_bitmap(CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END)) AS bitmap_union_basic
FROM lineitem
LEFT OUTER JOIN orders ON lineitem.l_orderkey = orders.o_orderkey AND l_shipdate = o_orderdate
GROUP BY
l_shipdate,
o_orderdate,
l_partkey,
l_suppkey;
2.查询语句
SELECT
    l_shipdate, l_suppkey,
    sum(o_totalprice) AS sum_total,
    max(o_totalprice) AS max_total,
    min(o_totalprice) AS min_total,
    count(*) AS count_all,
    count(distinct CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END) AS bitmap_union_basic
FROM lineitem
LEFT OUTER JOIN orders ON lineitem.l_orderkey = orders.o_orderkey AND l_shipdate = o_orderdate
WHERE o_orderdate = '2023-12-11' AND l_partkey = 3
GROUP BY
l_shipdate,
l_suppkey;
3.查询语句优化
SELECT
    l_shipdate, l_suppkey,
    sum_total,
    max_total,
    min_total,
    count_all,
    count(distinct CASE WHEN o_shippriority > 1 AND o_orderkey IN (1, 3) THEN o_custkey ELSE null END) AS bitmap_union_basic
FROM rv3
WHERE o_orderdate = '2023-12-11' AND l_partkey = 3
GROUP BY
l_shipdate,
l_suppkey;

4.总结

自动查询优化,而且支持join过程部分字段的优化以及异步刷新操作,异步刷新就是类似Mysql读写机制,记录日志,然后根据日志进行更新操作。而且是后台启动线程去操作,而不需要操作完成再返回成功。

<think>好的,我需要回答用户关于Doris创建物化视图是否支持自定义变量的问题。首先,我得回忆一下Doris物化视图功能,尤其是语法和限制。根据引用中的内容,用户提供的参考信息里有建表语句和创建物化视图的示例。比如引用2提到建表语句的结构,引用3给出了一个物化视图的例子,使用了select语句聚合数据。 用户的问题是关于是否支持在创建物化视图时使用自定义变量。首先,我需要明确Doris物化视图定义语法。通常,物化视图是基于现有表的数据,通过SELECT语句定义的聚合或预计算结果。在Doris中,创建物化视图的语法类似于引用3中的例子,使用CREATE MATERIALIZED VIEW ... AS SELECT ...。这里的SELECT语句通常只能引用基表中的列和内置函数。 接下来,考虑自定义变量的概念。自定义变量可能指的是用户定义的会话变量或局部变量。例如,在MySQL中,用户可以使用@var来定义会话变量,在查询中使用。但在Doris的上下文中,是否允许在物化视图的SELECT语句中使用这类变量呢?需要查阅Doris的官方文档或确认现有功能。 根据现有的引用资料,尤其是引用3中的示例,物化视图的创建语句中没有使用任何自定义变量,而是直接引用了表中的列和内置聚合函数如count和bitmap_union。这可能暗示Doris物化视图定义不支持在SELECT子句中使用用户自定义变量,只能使用基表的列和内置函数。此外,在引用2的建表语句中,也没有提到变量相关的参数,进一步支持这一观点。 另外,考虑到物化视图需要预先计算并存储结果,其定义需要是静态的,不能依赖运行时变量。自定义变量通常在查询时动态赋值,而物化视图的创建是DDL操作,需要在定义时确定所有内容。因此,Doris可能不支持在创建物化视图时使用自定义变量,因为这会导致物化视图的结构依赖于不固定的值,影响其稳定性和可优化性。 总结一下,目前的资料和常规的物化视图设计原则都表明,Doris在创建物化视图时不支持使用自定义变量。用户需要在SELECT语句中明确指定列和表达式,而不可以引用会话变量或其他动态变量。</think>在Doris中,**创建物化视图时不支持直接使用自定义变量**。物化视图的定义需要基于基表的列和内置函数,且必须为静态的、可预计算的表达式,以确保数据的一致性和可优化性[^3][^2]。 ### 详细说明 1. **物化视图的语法限制** Doris物化视图通过`CREATE MATERIALIZED VIEW ... AS SELECT ...`语句定义,其`SELECT`子句仅允许引用基表的列和Doris支持的内置函数(如聚合函数`SUM`、`COUNT`,或位图函数`bitmap_union`)。例如: ```sql create materialized view tp_pv_uv as select dt, ad_page, count(refer_page) as pv, bitmap_union(to_bitmap(user_id)) as uv from ad_view_record group by dt, ad_page; ``` 此示例中未使用任何自定义变量,仅通过列和内置函数完成逻辑定义。 2. **自定义变量的适用场景** Doris支持会话变量(如`SET var_name = value`),但这些变量主要用于查询时的动态配置(如超时时间、并行度等),**无法直接在物化视图的定义中引用**。物化视图是预计算的静态结构,其定义需在创建时完全确定[^2][^3]。 3. **替代方案** - 若需动态参数化查询,可通过应用层逻辑生成物化视图的定义语句。 - 若需复用计算逻辑,可结合视图(View)或UDF(用户自定义函数)实现,但需注意UDF需预先注册到Doris中[^4]。 ### 相关引用 - 创建物化视图的语法和限制可参考Doris的建表语句规范和物化视图示例。 - 更多动态配置和优化方法可关注Doris的官方更新日志[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值