当前位置: 首页 > news >正文

Doris中的物化视图(十八)

物化视图就是包含了查询结果的数据库对象,可能是对远程数据的本地 copy,也可能是一个表或多表 join 后结果的行或列的子集,也可能是聚合后的结果。说白了,就是预先存储查询结果的一种数据库对象。

在 Doris 中的物化视图,就是查询结果预先存储起来的特殊的表。

物化视图的出现主要是为了满足用户,既能对原始明细数据的任意维度分析,也能快速的对固定维度进行分析查询。

适用场景

  1. 分析需求覆盖明细数据查询以及固定维度查询两方面。

  2. 查询仅涉及表中的很小一部分列或行。

  3. 查询包含一些耗时处理操作,比如:时间很久的聚合操作等。

  4. 查询需要匹配不同前缀索引。

优势

  1. 对于那些经常重复的使用相同的子查询结果的查询性能大幅提升。

  2. Doris 自动维护物化视图的数据,无论是新的导入,还是删除操作都能保证 base 表和物化视图表的数据一致性。无需任何额外的人工维护成本。

  3. 查询时,会自动匹配到最优物化视图,并直接从物化视图中读取数据。

  4. 自动维护物化视图的数据会造成一些维护开销,会在后面的物化视图的局限性中展开说明。

物化视图 VS Rollup

在没有物化视图功能之前,用户一般都是使用 Rollup 功能通过预聚合方式提升查询效率的。但是 Rollup 具有一定的局限性,他不能基于明细模型做预聚合。

物化视图则在覆盖了 Rollup 的功能的同时,还能支持更丰富的聚合函数。所以物化视图其实是 Rollup 的一个超集。

也就是说,之前 ALTER TABLE ADD ROLLUP 语法支持的功能现在均可以通过CREATE MATERIALIZED VIEW 实现。

物化视图原理

Doris 系统提供了一整套对物化视图的 DDL 语法,包括创建,查看,删除。DDL 的语法和 PostgreSQL, Oracle 都是一致的。但是 Doris 目前创建物化视图只能在单表操作,不支持 join。

创建物化视图

首先要根据查询语句的特点来决定创建一个什么样的物化视图。并不是说物化视图定义和某个查询语句一模一样就最好。这里有两个原则:

(1)从查询语句中抽象出,多个查询共有的分组和聚合方式作为物化视图的定义。

(2)不需要给所有维度组合都创建物化视图。

首先第一个点,一个物化视图如果抽象出来,并且多个查询都可以匹配到这张物化视图。这种物化视图效果最好。因为物化视图的维护本身也需要消耗资源。

如果物化视图只和某个特殊的查询很贴合,而其他查询均用不到这个物化视图。则会导致这张物化视图的性价比不高,既占用了集群的存储资源,还不能为更多的查询服务。

所以用户需要结合自己的查询语句,以及数据维度信息去抽象出一些物化视图的定义。

第二点就是,在实际的分析查询中,并不会覆盖到所有的维度分析。所以给常用的维度组合创建物化视图即可,从而到达一个空间和时间上的平衡。

通过下面命令就可以创建物化视图了。创建物化视图是一个异步的操作,也就是说用户成功提交创建任务后,Doris 会在后台对存量的数据进行计算,直到创建成功。

具体的语法可以通过下面命令查看:

HELP CREATE MATERIALIZED VIEW

这里以一个销售记录表为例:

比如我们有一张销售记录明细表,存储了每个交易的时间,销售员,销售门店,和金额。

提交完创建物化视图的任务后,Doris 就会异步在后台生成物化视图的数据,构建物化视图。

在构建期间,用户依然可以正常的查询和导入新的数据。创建任务会自动处理当前的存量数据和所有新到达的增量数据,从而保持和 base 表的数据一致性。用户不需关心一致性问题。

相关文章:

  • DNS协议、ICMP协议、NAT技术
  • fastdfs-client-java-1.30 maven 打包安装
  • 计算机网络_第五章_运输层
  • 红酒按照糖含量怎么分类?
  • 渲染农场渲染一分钟动画需要多少钱?需要渲染多少时间?
  • 贪心算法个人见解
  • java.math.BigDecimal cannot be cast to java.lang.String问题
  • Linux的基本指令 ( 一 )
  • 服务器环境是什么意思?
  • Elasticsearch:ES|QL 函数及操作符
  • 18.天气小案例
  • 华为---OSPF网络虚连接(Virtual Link)简介及示例配置
  • curl添加https服务
  • 电脑便签功能在哪里找?电脑桌面便签怎么添加?
  • 47-设计问题-最小栈
  • Android 架构优化~MVP 架构改造
  • css的样式优先级
  • JavaScript 奇技淫巧
  • npx命令介绍
  • Promise面试题2实现异步串行执行
  • Theano - 导数
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​第20课 在Android Native开发中加入新的C++类
  • #LLM入门|Prompt#3.3_存储_Memory
  • #宝哥教你#查看jquery绑定的事件函数
  • ()、[]、{}、(())、[[]]命令替换
  • (4)事件处理——(7)简单事件(Simple events)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (转)大道至简,职场上做人做事做管理
  • (转)德国人的记事本
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET的数据绑定
  • .NET面试题(二)
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net中wcf服务生成及调用
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @SuppressWarnings(unchecked)代码的作用
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [4.9福建四校联考]
  • [BROADCASTING]tensor的扩散机制
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CISCN2019 华东北赛区]Web2
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [HNOI2018]排列
  • [JS]数据类型
  • [leetcode]_String to Integer (atoi)
  • [MFC] MFC消息机制的补充
  • [Poetize6] IncDec Sequence
  • [Python学习笔记]Requests性能优化之Session