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

2024-03-15 17:20
文章标签 doris 异步 视图 物化

本文主要是介绍关于Doris的物化视图与异步物化视图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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) t1LEFT OUTER JOIN ordersON 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吧)
SELECTl_shipdate, l_suppkey, o_orderdatesum(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.查询语句
SELECTl_shipdate, l_suppkey, o_orderdatesum(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_orderdatesum(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)
SELECTl_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.查询语句
SELECTl_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.查询语句优化
SELECTl_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读写机制,记录日志,然后根据日志进行更新操作。而且是后台启动线程去操作,而不需要操作完成再返回成功。

这篇关于关于Doris的物化视图与异步物化视图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812692

相关文章

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线