Products
GG网络技术分享 2026-04-16 08:59 2
不错。 说实话,每次看到那个查询进度条还在那里慢慢爬,我就想砸键盘!真的,太慢了!数据量一大,传统的那些视图简直就是个摆设,除了给你画个饼,啥实际用处都没有。每次都要重新计算,CPU都烧干了用户还在那边催催催。这时候,我就不得不提一下物化视图了这玩意儿简直就是数据仓库里的救命稻草。
C位出道。 你可能会问,这到底是个啥?别急,听我慢慢给你瞎扯...哦不是分析。与传统视图不同,物化视图会实际存储数据,而不是在查询时动态计算。这意味着什么?意味着你把后来啊预先算好存那儿了用户来查的时候,直接把后来啊甩给他,多爽!但是 这玩意儿也不是万能的,维护起来也挺麻烦,不过今天我们主要聊聊怎么用它来优化查询,特别是那个叫Calcite的框架是怎么搞的。

一旦您创建了一个或多个物化视图,到头来用户就可以查询数据库中的表和视图.数据仓库内的物化视图对于到头来用户或数据库应用程序来说是透明的.Oracle 服务器中的查询重写机制自动重写 SQL 查询以使用概要表.你看, 连Oracle这种老古董都在用,说明这东西确实有点东西。但是Oracle那是商业软件,咱们今天聊的开源界的扛把子——Calcite。
Calcite这东西, 说白了就是一个动态数据管理框架,它最牛的地方就在于那个查询优化器。而物化视图优化,就是它手里的一把利剑。它的核心思想就是:既然你已经算过了我就别再算一遍了。 开搞。 但是怎么知道你的查询能用到那个物化视图呢?这就涉及到一个高大上的过程——查询 。
说到 ,就不得不提那个让人头秃的SPJG理论。论文提出SPJG查询 , 是SQL Server 2000视图 的理论基础,基于selection, project, join, group-by算子匹配的视图 方案,是当前很多计算引擎的物化视图查询 的理论基础,比方说:Calcite、Doris、StarRocks都基于优化器的SPJG结构 进行 实现。你看,这影响力,简直了!
那SPJG是啥意思?Select、Project、Join、GroupBy。这四个操作大体上覆盖了SQL查询的90%以上的场景。Calcite就是基于这个理论来判断你的查询能不能匹配上物化视图。
这中间有个很关键的类,叫MaterializedViewRule。基于CBO选择代价最优的 的计划树。基于perform 实现SPJG条件判断。这代码写得...哎, KTV你。 不提了反正就是一堆逻辑判断。它会循环遍历查询SQL的RelNode关系表达式和生成物化视图QueryRelNode表达式,基于Rel...反正就是各种比对。
| 主流数据库引擎物化视图支持对比 | 支持程度 | 自动重写 | 维护难度 |
|---|---|---|---|
| Apache Calcite | 核心功能, 基于SPJG理论 | 支持 | 中等 |
| Oracle | 企业级,功能完善 | 支持 | 高 |
| Hive | 支持 | 支持 | 高 |
| PostgreSQL | 原生支持 | 支持 | 中等 |
PTSD了... 最让人头疼的就是匹配逻辑了。有时候你觉得明明能匹配上,它就是不用!气死个人。这中间涉及到很多复杂的条件,比如表匹配情况。查询源表与视图源表的匹配类型有好几种:
针对这些情况,Calcite有一套严密的判断逻辑。如果 YYDS... 是针对具有GroupBy聚合处理的SPJG 需额外判断
1.行覆盖性
这玩意儿就是说物化视图里的数据能不能覆盖查询需要的数据。如果物化视图里只有一部分数据,那查出来的后来啊肯定不对啊。所以得校验。
2.输出表达式可计算性
输出表达式:常量表达式、 简单列引用、其他表达式。如果查询里有个计算公式, 比如 a + b而物化视图里只存了 a 和 b那还好,能算;但如果物化视图里存的是 a * b那你就没法反推 a + b 了这就叫不可计算,另起炉灶。。
3.行重复因子正确性
干就完了! 这个就更绕了。涉及到连接的时候,数据行数可能会变多或者变少。如果物化视图做了聚合,而查询没做,或者反过来那行数对不上,后来啊也就错了。
太暖了。 咱们再来点硬核的,别说我只会讲大道理。这里有个概念叫列等价类一组相互之间值相等的列集合, 可基于等值连接获取,实现列引用重新路由是视图 的重要能力。啥意思呢?就是说表A的ID和表B的ID如果相等,那它们就是一伙的。查询里要查表A的ID,物化视图里存的是表B的ID,没关系,主要原因是它们等价,可以替换!这就是路由!
还有那个补偿谓词校验。这名字听着就晕。补偿谓词校验:等值连接补偿谓词、范围补偿谓词、剩余补偿谓词。简单说就是物化视图里的过滤条件可能比查询里的多,也可能少。如果物化视图过滤得多了那剩下的数据还能满足查询条件吗? 翻旧账。 这就需要校验。用到了CNF谓词拆分+蕴含校验:等值连接蕴含校验 + 范围蕴含校验 + 剩余蕴含校验。是不是感觉回到了大学数学课堂?我也觉得。
走捷径。 该论文主要贡献,提出:物化视图和查询的连接类型相同。这听起来是废话,但实际操作中,连接顺序变了连接类型变了那后来啊集可能就完全不一样了。
| 匹配状态 | 含义 | 能否使用 |
|---|---|---|
| COMPLETE | 完美匹配, 物化视图完全包含查询所需数据 | ✅ 是 |
| QUERY_PARTIAL | 查询部分匹配,可能需要额外计算 | 🤔 视情况而定 |
| VIEW_PARTIAL | 视图部分匹配,物化视图数据范围过大 | 🤔 视情况而定 |
| UNDEFINED | 完全不匹配,或者无法判断 | ❌ 否 |
现在很多大数据组件都基于Calcite,比如Hive。Hive适配器:支持使用Hive创建的物化视图进行查询优化. 这就给Hive用户带来了福音。Hive 物化视图 目标 Hive中物化视图的管理 创建物化视图 物 搞起来。 化视图管理的其他操作 基于物化视图的查询重写 物化视图的维护 物化视图的生命周期 .关于重写覆盖面的更多信息可以在calcite找到.传统上,用于加速数据仓库查询处理的最强大的技术之一是预先计算相关的摘要或物化视图.
还有一个叫Lattice的东西。Lattice是一个创建并填充物化视图的框架,可以识别以及解决特定查询的物化视图.2)它帮助查询施行器将用户的查询行为映射到filter-join-aggregate 物化视图.这名字起得挺玄乎, 探探路。 其实就是帮你自动决定该建哪些物化视图最划算。
通过使用物化视图来加速查询,当输入一个不使用物化视图的查询时,系统会自动将查询重写为使用现有物化视图的查询.该方法的原理是将查询语句与物化视图的定义进行匹配,如果发现匹配的物化视图,则自动将查询重写为使用物化视图的查询,这样可以大大提高查询性能和效率. 物化视图查询 使用限制 FROM子句中包含物化视图中出现全部的表 不堪入目。 ,可以包含物化视图中不存在的表,并且连接顺序是兼容的. 在查询无聚合的情况下,要求物化视图没有聚合. 规则/代价检查 物化视图 SELECT count, test_tbl1.col1 col1 FROM test_tbl1, test_tbl2 WHERE test_tbl1.col1 = test_tbl2...
吃瓜。 你看,这代码片段都出来了。基于列等价类理论, 视图与查询源表相同的情况下SPJ需要满足四个条件。哪四个?刚才好像说了行覆盖、输出可计算、行重复因子、还有那个连接类型。少一个都不行!
它的目标不是通用查询优化,而是把 WHERE 条件 吸收到聚合调用里,使计划更适合做物化视图 和后续等价变换.物化视图匹配少了一层算子差异;.这句话说得挺有道理, 有时候为了匹配,得把查询改得面目全非,只要后来啊对就行,哭笑不得。。
可以被Calcite规划器 成对物化视图的查询:.是从传统的关系型数据库系统借鉴而来,传统概念上,一个物化视图包含一个SQL查询和这个查询所生成的数据表.所以说 技术都是相通的, 容我插一句... 天下文章一大抄,看你会不会抄了。
本篇文章会先介绍如果 物化视图,接下来会说明 calcite 的物化视图 逻辑.如果利用物化视图进行加速,主要是对用户查询进行 ,使查询命中物化视图然后进行 .这听起来像句废话,但确实是这么回事,在理。。
解释起来真的很费劲,解释 将查询和物化视图进行以下前置处理。这中间的步骤多得让人怀疑人生。什么匹配类型 针对具有GroupBy聚合处理的SPJG 需额外判断 1.行覆盖性 约束条件:非空约束、主键唯一键约束、显式/隐式的唯一性约束、外键约束 CNF谓词拆分+蕴含校验:等值连接蕴含校验 + 范围蕴含校验 + 剩余蕴含校验。这些约束条件一个都不能少,少一个数据可能就错了,划水。。
简介:此文档是关于ORACLE使用物化视图和查询重写功能的doc文档,编号为100337681,其中主题是关于专业资料、行业资料的内容展示。你看,连Oracle都有专门的文档编号,说明这东西多重要。
再说说我想说的是虽然Calcite的物化视图优化很强大,但也不是银弹。你得建对视图,得维护好数据,还得懂这些复杂的匹配规则。不然它不仅不帮你, 实不相瞒... 还可能给你添乱。但是一旦你搞懂了它,那查询速度,嗖嗖的!那种感觉,怎么形容呢?就像便秘了三天终于通畅了一样!爽!
所以别犹豫了赶紧去试试吧。虽然配置过程可能会让你想砸电脑,但是为了那毫秒级的响应,一切都值了!真的!相信我,境界没到。!
Demand feedback