Loading [MathJax]/extensions/TeX/AMSmath.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Calcite Lattice物化视图选择

Calcite Lattice物化视图选择

原创
作者头像
Yiwenwu
修改于 2025-02-09 07:04:12
修改于 2025-02-09 07:04:12
4300
举报
文章被收录于专栏:Calcite剖析Calcite剖析

背景

物化视图(Materialized View,简称MV):是一种特殊的物理表,本质是预计算。通过多个计算过程之间的联系建立,从数据组织层面优化数据访问效率,把某些长耗时的操作结果(例如JOIN、AGGREGATE) 直接保存到物理存储上,可以像表一样被访问,以便在后续查询时直接复用,最终实现加速查询的目标,即空间换时间。与之相对的,普通视图(View) 仅是对用户查询定义的一种简化,并不存储结果数据,无法加速查询。

为实现物化视图加速,需解决以下三个关键问题[1]:

  1. 视图选择:如何设计物化视图,选择哪些表和字段构建物化视图,最大化查询收益。
  2. 视图维护:如何最小成本的维护和更新物化视图数据,保证视图表与原始表的计算结果数据一致性。
  3. 视图改写:如何自动透明化的实现SQL查询改写,改写为通过物化视图的加速查询。

本文仅针对物化视图选择介绍,主要包括两部分:1. 介绍Lattice物化视图选择框架;2. 概述Calcite物化视图选择的实现原理。

Lattice选择框架

框架组成

数据格框架(Lattice Framework)[2]: 1996年由Harinarayan提出,参考数学概念,Lattice是其非空有限子集都有一个上确界和一个下确界的偏序集合。一个Lattice格 L, 由两个部分组成

1. 元素集合 L : 代表Lattice中所有元素的集合,是数据立方体中所有可能查询$Q$的集合,每个元素可代表一个特定的视图或查询。

2. 偏序关系⪯: 定义在元素集合L 上的偏序关系,用于表示元素之间的表示关系。如果查询Q1 可通过查询 的改写表示,则 ,即$Q1$偏序于$Q2$。例如多维查询中, 可通过查询 表示,则 偏序于 ,表示为

在Lattice中,任意两个元素 都有一个最小上界(上确界),记作 ; 和一个最大下界(下确界),记作 。这意味着对于任意 ,都存在 使得 (即存在 的上确界),并且存在 使得 (即存在 的下确界)。

偏序关系存在以下特性:

※反对称性:对于任意元素 ,如果

※可传递性:对于任意元素 , ,如果 ,则

以单个时间维度的不同层级为例,有维度层级:Day(天)Week(周)Month(月)Year(年),可得到如下偏序关系:

多个维度可表示为组合偏序关系 意味着 ,表示 的结果可通过 计算。例如时间和地域的组合维度存在偏序关系:

代价&收益模型

代价模型:为合理评估视图选择的有效性,定义成本代价模型,其中 是视图 预估查询耗时,查询扫描数量大小 是一个固定代价。

收益模型: 最小化成本代价,尽可能提升查询效率。定义视图 的代价为 ,选择 个有效视图,其中集合$S$是当前已被选中的视图集合,则当前$v$的收益定义为 ,定义如下:

其中 的收益,计算公式如下, 在已选择视图集 中的偏序上确界,即 :

基于贪心算法选择 个视图,时间复杂度为 ,其中 为所有候选视图的数量,整体执行过程如下:

视图选择示例:定义Lattice的偏序关系和查询代价,展示 ,选择视图元素 , 后,元素 的选择收益。

其中视图 是顶层视图,默认初始化在选择集合 中,基于贪心算法选择3个视图执行过程如下: ,其中偏序集 共5个,分别为 。第一次选择收益最大的视图 ,第二次选择收益最大的视图 ,第三次选择收益最大的视图

视图

第一次选择

第二次选择

第三次选择

b

(100-50) × 5 = 250

c

(100-75) × 5 = 125

(100-75) × 2 = 50

(100-75) × 1 = 25

d

(100-20) × 2 = 160

(50-20) × 2 = 60

(50-20) × 2 = 60

e

(100-30) × 3 = 210

(50-30) × 3 = 60

(50-30) x 2 + (40-30) = 50

f

(100-40) × 2 = 120

(100-40) + (50-40) = 70

g

(100-1) × 1 = 99

(50-1) × 1 = 49

(50-1) × 1 = 49

h

(100-10) × 1 = 90

(50-10) × 1 = 40

(50-10) × 1 = 30

Calcite视图选择

实现说明

基于Calcite Lattice框架实现视图选择的核心流程如下,主要包括两部分:

  1. 视图构建:基于LatticeSuggester 将RelNode构建为Lattice对象;
  2. 视图选择:基于TileSuggester将构建好的Lattice对象转为算法所需的Schema对象,基于Pentaho 聚合选择算法 计算并选择出合适的视图。

LatticeSuggester

基于LatticeSuggester#addQuery 方法实现Lattice构建,自底向上构建Frame对象,遍历关键算子类型(如 TableScan、Filter等)获取计划树的聚合信息并维护在Frame中。基于LatticeSuggester#addFrame方法,将Frame对象转为Lattice对象,填充对应的Aggregate聚合字段和Columns表字段列表。最后,针对相同标识(基表)的Lattice对象支持合并处理,因此多个查询可合并为一个Lattice对象

TileSuggester

将所有RelNode构建完Lattice对象后,基于TileSuggester#tiles对每个Lattice对象进行视图选择推荐。Calcite利用Pentaho 开源的MonteCarloAlgorithm 蒙特卡洛算法实现视图选择,将Lattice对象转为扩展Pentaho Schema的对象,基于StatisticsProvider 提供收益代价选择所需的基数估计,最后将推荐的聚合字段封装为Tile对象,Tile聚合信息可通过Lattice#sql生成视图SQL。

存在问题

社区Calcite基于Lattice框架和Monte Carlo随机采样算法实现基本的视图选择功能,详情可参考官方文档Lattices。该实现存在以下问题:

1. 搜索空间庞大: 虽然引入Monte Carlo随机采样和超时机制优化,但大宽表的视图选择依然会频繁触发系统OOM异常退出。

2. 未考虑查询行为: 该选择框架仅考虑表结构信息,会对所有表字段进行聚合尝试以寻找理论最优视图选择,但该选择与用户的查询行为没有关联性,在实际查询中,推荐的视图命中率远低于预期值。

3. 代价估计不准确: Lattice是基于COST代价的视图选择框架,COST代价的准确性显著影响选择效果,原生Lattice统计信息缺失和不准确导致选择偏差较大。

附录

  1. Optimizing Queries Using Materialized Views: A Practical, Scalable Solution
  2. Implementing Data Cubes Efficiently
  3. Data profiling with Apache Calcite

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
解读 Implementing data cubes efficiently
预计算基于空间换时间实现查询性能提升,物化视图是数据立方体(data cubes)的一种实现方式。如何有效选择数据立方体进行物化是一个NP难问题,对于n维数据集,有2^n种选择可能。本论文提出基于数据格框架(Lattice Framework),通过贪心算法高效选择物化视图。
Yiwenwu
2024/09/10
1880
Calcite系列(十一):物化视图
物化视图(Materialized View):是一种特殊的物理表,本质是预计算,是多个计算过程之间的联系建立。从数据组织层面优化数据访问效率,即把某些耗时的操作(例如JOIN、AGGREGATE)的结果保存到物理存储上,可以像表一样被访问,以便在后续查询时直接复用,最终达到加速查询的目的,即空间换时间。而普通视图(View)仅是简化用户的查询定义,不存储实际结果数据。
Yiwenwu
2024/04/24
9180
基于catalyst的物化视图改写引擎的实现
更新日志: 1. 2020/06/16 group by 视图的部分描述错误,已修正。
用户2936994
2022/04/07
7340
一种基于分区列谓词补偿的物化视图增量更新方法
当前业界在做物化视图增量更新时,物化视图一般会存储在一张分区表中,以分区为粒度进行增量、刷新、删除;不然就需要生成大量的物化视图元数据或每次都要重新计算历史所有的物化数据,成本是巨大的。上述物化视图的增量为基础表数据append增加新分区,刷新为先删除后增加,删除即删除对应的分区;当前的物化视图分区表不允许有空洞,否则会导致物化视图无法命中;其他一致性问题见物化视图一致性问题。
jhonye
2023/03/03
1K0
​深入浅出 ClickHouse 物化视图
数据库查询语言(query language)是数据库管理系统(DBMS)提供给用户和数据库交互的工具,查询语言分为三类 [^1]:
腾讯技术工程官方号
2023/07/15
2.7K0
​深入浅出 ClickHouse 物化视图
Calcite基础入门(一)
这是一个循序渐进的教程,展示了如何构建和连接Calcite。它使用一个简单的适配器,使CSV文件的目录看起来是一个包含表的模式。Calcite完成了其余的工作,并提供了完整的SQL接口。
从大数据到人工智能
2022/01/18
2.4K0
ClickHouse物化视图在微信的实战经验
ClickHouse广泛用于用户和系统日志查询场景中,借助腾讯云提供基础设施,微信也在分阶段逐步推进clickhouse的建设和应用,目前作为基础建设的一部分,主要针对于OLAP场景,为业务方提供稳定高效的查询服务。
Vitamin_C
2021/06/08
5K1
ClickHouse物化视图在微信的实战经验
抽象代数基础
初等代数是古老算术的推广和发展,在初等代数中开始用变量代替具体的数字,它的中心是解方程
attack
2019/03/22
1.3K0
抽象代数基础
数据模型详解-究竟什么时候物化视图?
翻译内容 3.4. Materialized Views 第三段和第四段: Views provide a mechanism to hide from the client whether data is derived data or base data—but can’t avoid the fact that some views are expensive to compute. 视图提供了一种机制就是把数据封装起来,然后客户端调用者不管是原始数据(base data)还是派生数
ImportSource
2018/05/04
1.3K0
应用实践|Apache Doris物化视图与索引在京东的典型应用
导读:本文分享关于 Doris 的实际使用情况,主要是物化视图、索引的典型应用案例,以及在使用 Doris 过程中的一些心得。
从大数据到人工智能
2022/05/26
1.2K0
应用实践|Apache Doris物化视图与索引在京东的典型应用
物化视图中的统计信息导致的查询问题分析和修复 (r7笔记第47天)
今天开发的同事下午反馈给我一个问题,说有操作直接卡住了,听这个描述,感觉很可能是查询慢了。 于是连接到环境中,查看了一下正在执行的sql语句情况,发现下面的语句已经执行了一段时间。 语句类似下面的形式: select t1.SECURITY_PHONE as MOBILE_PHONE, t1.SECURITY_EMAIL as OTHER_EMAIL, t2.* from accstat.ACCOUNT_DELTA t1, bidata.TMP_CN06 t2 where t1.CN_MASTER =
jeanron100
2018/03/16
1.1K0
物化视图中的统计信息导致的查询问题分析和修复 (r7笔记第47天)
【Flink】第二十八篇:Flink SQL 与 Apache Calcite
【Flink】第四篇:【迷思】对update语义拆解D-、I+后造成update原子性丢失
章鱼carl
2022/03/31
2.5K0
【Flink】第二十八篇:Flink SQL 与 Apache Calcite
oracle物化视图的刷新命令_物化视图增量刷新
普通视图仅包含其定义和被引用表的元数据,并不实际存储数据,查询数据时需要通过视图再去主表中获取数据。但是当需要查询的数据字段过多时,普通视图的效率会急剧下降。物化视图将经常使用的数据拷贝并存储下来,在查询时就可以直接返回数据。本质上是一个物理表,会占用磁盘空间。
全栈程序员站长
2022/11/15
2.9K0
Oracle物化视图详解
现实工作中会有多个数据源同步到一个数据库完成数据分析的场景,这些数据可以不是实时同步的,我们一般通过定时任务抽取数据到统计分析库给应用使用。
星哥玩云
2022/08/16
3.4K0
ClickHouse物化视图(八)
create 语法,会创建一个隐藏的目标表来保存视图数据。也可以 TO 表名,保存到一张显式的表。没有加 TO 表名,表名默认就是 .inner.物化视图名
Java技术债务
2022/08/09
1.5K0
物化视图全量刷新的简单测试(63天)
关于物化视图的刷新,如果数据的变化比较大采用了全量刷新的时候,会将现有表里的数据都清空然后放入新的数据,整个过程有点类似delete,insert的感觉,但是刷新后表的高水位线还是会保持不变,效果类似于truncate,insert. 对于堆表来说,在重要的一些表上做truncate简直就是灾难,如果一个表访问频繁,做了truncate之后,在插入数据的过程中,如果访问该表,数据都是0条,这就会带来一些高可用性的问题来,如果采用一个事务,使用delete,insert的方式,那高水位线的问题还是得不到解决
jeanron100
2018/03/13
1.3K0
TiFlink:使用 TiKV 和 Flink 实现强一致的物化视图丨TiDB Hackathon 项目分享
本文为 TiDB Hackathon 2020 比赛中 TiFlink 项目最新进展的介绍,使用 TiKV 和 Flink 实现了强一致的物化视图的功能。
PingCAP
2021/10/28
9160
物化视图prebuilt和在线重定义 (r10笔记第25天)
数据迁移中有一种解决方案很有亮点,如果表的数据量大,迁移涉及的表不多,同时对于维护时间有要求的情况下,物化视图的prebuilt方式就是一种很不错的选择。 大体的步骤和方法如下: 假设源环境是test_source,目标环境是test_target 在源环境中test_source的操作如下: Create table test_mv as select *from all_objects ; alter table test_mv modify(object_id primary key); crea
jeanron100
2018/03/19
8620
StarRocks存算分离在得物的降本增效实践
OLAP引擎在得物的客服、风控、供应链、投放、运营、ab实验等大量业务场景发挥重要作用,在报表、日志、实时数仓等应用场景都有广泛的应用。
得物技术
2024/12/02
4190
oracle物化视图
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。
HUC思梦
2020/09/03
1.4K0
推荐阅读
相关推荐
解读 Implementing data cubes efficiently
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档