Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Calcite系列(十一):物化视图

Calcite系列(十一):物化视图

原创
作者头像
Yiwenwu
发布于 2024-04-24 02:05:33
发布于 2024-04-24 02:05:33
9211
举报
文章被收录于专栏:Calcite剖析Calcite剖析

背景

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

物化视图使用存在一定门槛,提高查询性能的同时也引入了相应的成本:

  • 存储成本:物化表存储空间;
  • 计算成本:若源表(base表)数据变更,物化视图自动失效,需计算更新后才可用;

因此,物化视图并不适合所有场景,使用物化视图条件:提速收益 > 存储成本 + 计算成本。

物化视图适合场景:

  • 源表变更不频繁:降低计算成本;
  • 相比于源表,物化表的字段和结果数量有明显的减少:降低存储成本;
  • 物化表查询子句的执行是高成本的,(1).计算频繁,(2).计算复杂(消除Join和聚合的计算开销),(3).读取扫描量大:提高加速收益;

使用场景示例:

  • 查询存储在外部(冷存储),相比于内部存储(热存储),外部存储性能较低;
  • 对于数据仓库,物化视图可物化查看结果,屏蔽多个数据源差异,实现本地副本;

视图改写

视图改写常用的方式:

  1. 基于语法改写:最简单的改写方式,将查询的文本与物化视图的文本或语法树进行比较,完全匹配则可以进行改写;
  2. 基于规则改写:针对不同规则,穷举所有可能变换关系来寻找等价替代关系树;
  3. 基于结构改写提取查询特征并使用一套规则进行匹配改写,将查询表示为SPJG标准形式,提取查询中Join、Projects、Filters、Grouping、Aggregation五种表达式,分别与物化视图对应的表达式进行匹配改写;

Calcite 物化视图查询改写支持两种方式:

  1. 基于规则改写: 由 MaterializedViewSubstitutionVisitor实现,基于规则和等价类自底向上匹配
  2. 基于结构改写:由 MaterializedViewRule 规则集构成,基于查询优化器实现改写

Calcite物化视图的结构改写逻辑主要基于Goldstein 和 Larson 的“Optimizing Queries Using Materialized Views: A Practical, Scalable Solution”实现(Microsoft SQL Server的改写方案),是一种SPJG(join-select-project-groupBy)重写算法。

SPJ(join-select-project)视图改写条件:

  • The view contains all rows needed by the query expression:视图行数据可覆盖包含查询表达式的所有行;
  • All required rows can be selected from the view:查询结果可通过视图查询到;
  • All output expressions can be computed from the output of the view:查询结果表达式可通过视图计算查询到;
  • All output rows occur with the correct duplication factor:对于重复语义的算子,有相同一致的行为,如distinct算子在相同的字段;

Calcite MaterializedViewRule 实现结构改写规则,可参考单测 MaterializedViewRelOptRulesTest

Lattice

Lattice(格):是一个数学概念,表示数学上的一种集合,非空有限子集都有一个上确界(并)和一个下确界(交)的偏序结合。Calcite针对物化视图对Lattice进行扩展,根据用户定义的关联和聚合要求,划分出多个物化视图来适应不同类别的查询,支持自动划分物化视图。 Calcite中Lattice定义功能:

  • 可声明主键和外键约束;
  • 辅助优化器将用户查询映射到物化视图;
  • 提供框架,用于采集数据量和用户查询统计信息;
  • 允许Calcite自动产生物化视图

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

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

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

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

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

评论
登录后参与评论
1 条评论
热度
最新
厉害了
厉害了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Python终端显示彩色字符(封装了Co
         有时候需要在终端显示彩色的字符,即根据需要显示不同颜色的字符串,比如我们要在
py3study
2020/01/09
2.1K0
Python colorama | 详解终端漂亮的彩色打印怎么实现的
构建命令行程序很酷:命令行可以按照我们的设定完成相应的工作,相比 GUI 界面程序,无需花费大量时间设计 GUI 界面。但要使命令行程序更吸引人,仅使用普通的打印功能是无法实现的。
叶庭云
2022/05/09
4.5K0
Python colorama | 详解终端漂亮的彩色打印怎么实现的
Python入门之Python Colorama模块
Python的Colorama模块,可以跨多终端,显示字体不同的颜色和背景,只需要导入colorama模块即可,不用再每次都像linux一样指定颜色; 官方参考:https://pypi.org/project/colorama/ 1. 安装colorama模块 win python -m pip install colorama linux pip install colorama 2. 常用格式常数 Fore是针对字体颜色,Back是针对字体背景颜色,Style是针对字体格式 Fore: BLACK,
Jetpropelledsnake21
2018/06/14
2.4K1
Python风骚的颜色输出与进度条打印
大家平时在Linux/Windows下安装软件时,经常会出现进度条和百分比的提示,Python是否能实现这样的打印?安装过程中,经常会看到很多带颜色的安装说明,我们在python输出时,确是千篇一律的黑底白色,是否想过打印的炫酷一些呢?
AI算法与图像处理
2019/11/27
2.8K0
一个 print 函数,挺会玩啊?
这是「进击的Coder」的第 700 篇技术分享 作者:HOLL4ND 来源:Python 编程时光 “ 阅读本文大概需要 7 分钟。 ” 在终端中,输出的字体总是单一颜色的,黑底白字。但是在一些场景并不能很好的满足输出的需求,比如在大量而快速输出中,输出一些提示性或者警告性的信息,普通的黑底白字输出可能或起不到作用。 本文将介绍如何输出颜色字体到终端界面中。 # 1. ANSI 转义序列 其实终端不仅能够显示程序的输出。它可以显示移动光标、为文本着色、清除整个屏幕,并且不仅仅是静态输出。比如颜色字体或
崔庆才
2022/07/26
4910
一个 print 函数,挺会玩啊?
termcolor: 轻量级终端输出彩色文本库
总而言之,colorama 主要用于解决 Windows 系统的兼容性问题,而 termcolor 提供了更方便的文本着色函数。 根据你的需求选择合适的库即可。
luckpunk
2025/01/16
2110
termcolor: 轻量级终端输出彩色文本库
母亲节祝福网页制作
杨校
2025/05/10
4320
母亲节祝福网页制作
python命令行or控制台or日志带有颜色的输出
在几年前,我写过一个项目,喜欢花里胡哨的我看到别人输出到控制台带有颜色,于是我也想要。
梦无矶小仔
2023/08/03
1.1K0
python命令行or控制台or日志带有颜色的输出
Linux启动分析器
受 Sysinternals 的“Autoruns”的启发,RCLocals 分析所有 Linux 启动可能性以查找后门,还执行进程完整性验证、扫描 DLL 注入进程等等
Khan安全团队
2021/12/30
7770
WordPress 插件 dzs-zoomsounds - 远程代码执行 (RCE)
import os import requests import threading from multiprocessing.dummy import Pool,Lock from bs4 import BeautifulSoup import time import smtplib,sys,ctypes from random import choice from colorama import Fore from colorama import Style from colorama import i
Khan安全团队
2022/03/03
6790
Python "圣诞树"
import termcolor import random import time import datetime from os import system, name from colorama import init from termcolor import colored def clear(): # check if windows if name == 'nt': _ = system('cls') # if *nix else:
致Great
2018/12/28
1.3K0
十个小众却实用的Python库,用过的都说香!
今天,我们将和大家分享一些用于数据科学任务的Python库,这些库并不常见,它们不如panda、scikit-learn、matplotlib等知名,但却十分实用,下面就一起来看看都有哪些库:
昱良
2020/03/28
1.5K0
Python操作excel:用xlwt设置excel单元格背景颜色,给字体加粗。【附】颜色表
xlwt.easyxf() 设置样式,pattern 指的就是背景,ice_blue 就是我设置的颜色。 font 就是设置字体,bold on 是加粗。 样式可以合一起,之间用分号;分开。
小蓝枣
2020/09/23
3.7K0
10分钟开发一个npm全局依赖包(下)
在上一篇中我们用了10分钟实现了一个完整的古诗词命令行工具,本章中我们主要简绍2个命令行工具开发中常用的库,整个代码大概用时20分钟。
kai666666
2020/10/17
7470
关于如何用Python代码生成一棵圣诞树
今天就不放硬核推文了,下面这段代码是我在节前调试好了的一版圣诞树的Demo源码,一款可以动态打印的圣诞树界面。
Coder-ZZ
2023/12/20
5330
关于如何用Python代码生成一棵圣诞树
盘点那些鲜为人知却非常实用的Python数据科学库
Python是一门神奇的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了它在跨行业的开发人员工作角色和数据科学职位上的有用性。Python的整个生态系统及其库使其成为全世界用户(初学者和高级用户)的一个恰当选择。它的成功和流行的一个原因是它的健壮的库集的存在,使它如此动态和快速。
HuangWeiAI
2020/02/24
8960
第三十三章:修改SpringBoot启动Banner
Banner是SpringBoot框架一个特色的部分,其设计的目的无非就是一个框架的标识,其中包含了版本号、框架名称等内容,既然SpringBoot为我们提供了这个模块,它肯定也是可以更换的这也是Spring开源框架的设计理念。 本章目标 修改SpringBoot启动Banner内容. SpringBoot 企业级核心技术学习专题 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Boot 核心技术章节源码 Sprin
恒宇少年
2018/06/27
8420
python改变输出字体颜色==>colorama
colorama是python第三方库中一个可以改变输出流颜色的玩意儿, 安装可以通过:
周小董
2019/03/25
6.3K1
python改变输出字体颜色==>colorama
控制台彩色输出
今天在看另外一个优秀框架的源码的过程中,我发现了一个奇怪的现象,框架输出的内容居然自带颜色,这引起了我极大的好奇心。
FunTester
2021/12/09
2.3K0
控制台彩色输出
Python 小型项目大全 26~30
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 . . .
ApacheCN_飞龙
2023/04/12
5460
Python 小型项目大全 26~30
推荐阅读
相关推荐
Python终端显示彩色字符(封装了Co
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档