关于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

相关文章

异步线程traceId如何实现传递

《异步线程traceId如何实现传递》文章介绍了如何在异步请求中传递traceId,通过重写ThreadPoolTaskExecutor的方法和实现TaskDecorator接口来增强线程池,确保异步... 目录前言重写ThreadPoolTaskExecutor中方法线程池增强总结前言在日常问题排查中,

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

数据视图(AngularJS)

<!DOCTYPE html><html ng-app="home.controller"><head><meta charset="utf-8"><title>数据视图</title><link href="page/common/css/bootstrap.min.css" rel="stylesheet"><script src="page/common/js/angular.js"></

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

三.海量数据实时分析-FlinkCDC实现Mysql数据同步到Doris

FlinkCDC 同步Mysql到Doris 参考:https://nightlies.apache.org/flink/flink-cdc-docs-release-3.0/zh/docs/get-started/quickstart/mysql-to-doris/ 1.安装Flink 下载 Flink 1.18.0,下载后把压缩包上传到服务器,使用tar -zxvf flink-xxx-