PostgreSQL技术内幕15:物化视图

news2024/10/21 20:24:06

文章目录

    • 0.简介
    • 1.物化视图简介(背景和概念)
    • 2.物化视图使用方式
      • 2.1 创建物化视图
      • 2.2 查询物化视图
      • 2.3 刷新物化视图
      • 2.4 修改物化视图
      • 2.5 物化视图删除
    • 3.物化视图实现原理
    • 4.物化视图源码分析

0.简介

本节主要介绍PG的物化视图,从物化视图产生背景到使用方式,实现思路以及源码分析多个方面来对物化视图进行详细的分析。

1.物化视图简介(背景和概念)

了解物化视图需要先对视图有所了解,视图可以看作是一个虚拟的表,用一个名字来代替一个复杂的语句,在存储层面来讲,其存储的是一条创建时的语句而不是实际去存储数据。
通过视图,屏蔽了外部使用的复杂sql,但是每次查询需要扫描获取结果集(也就是执行创建视图对应结果的sql),这明显会带来效率上的问题 。为了解决这个问题,就出现了物化视图,其和视图差异在于,物化视图会存储自己的结果集,下次读取的时候直接读取自己的结果集,而不需要扫描原始表,物化视图的结果集的存储和扫描方式和普通表相同。

2.物化视图使用方式

2.1 创建物化视图

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] name
AS query [ WITH [ NO ] DATA ];

和普通视图相比,前面多了materialized关键字,with no data是是否在创建时填充数据,如果带着WITH NO DATA表示创建时不填充数据,要查询视图结果集,需要执行刷新语句。

2.2 查询物化视图

物化视图的查询和正常表的查询使用一致。

2.3 刷新物化视图

REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] name [ WITH [ NO ] DATA ];

CONCURRENTLY可以支持刷新物化视图时其他连接的并发读取。其不能和with no data一起使用。

2.4 修改物化视图

ALTER MATERIALIZED VIEW [ IF EXISTS ] name
RENAME [ COLUMN ] column_name TO new_column_name;

ALTER MATERIALIZED VIEW [ IF EXISTS ] name
RENAME TO new_name;

ALTER MATERIALIZED VIEW [ IF EXISTS ] name
SET SCHEMA new_schema;

第一个用来修改物化视图列名称,第二个用来修改物化视图名称,第三个用来修改物化视图模式。

2.5 物化视图删除

DROP MATERIALIZED VIEW [ IF EXISTS ] name [ CASCADE | RESTRICT ];

删除直接使用drop即可。

3.物化视图实现原理

物化视图实现主要需要解决的问题点是:
1)数据如何存储
PG对于物化视图的数据存储采用的是和表存储结构一致,把其当成一张表来做处理。
2)如何和源表(也可以叫做基表)同步
目前PG仅仅是提供了手动刷新的方式来和源表来做同步,是一种全量更新的手段,如果想做定期更新可以使用一些触发器,函数定义等手段;这点来说可以参考starrocks,其采用定时任务提供异步的物化视图,和分区版本概念来做到增量同步,也支持同步的物化视图,主要通过关联更新来实现多个部分的联动更新。

4.物化视图源码分析

PG源码主要来看创建部分,即如何物化。

exec_simple_query
--> pg_parse_query
--> pg_analyze_and_rewrite
--> pg_plan_queries
--> PortalStart
--> PortalRun
    --> PortalRunUtility    // Execute a utility statement inside a portal.
        --> ProcessUtility
            --> standard_ProcessUtility
                --> ProcessUtilitySlow
                    /*
                     * 执行步骤:
                     *         1. 创建表,准备存储结果集
                     *         2. 查询重写(物化视图中的查询语句)
                     *         3. 生成查询的执行计划
                     *         4. 执行获取查询语句的结果集
                     */
                    --> ExecCreateTableAs  
                        // Create the tuple receiver object and insert info it will need
                        -->  CreateIntoRelDestReceiver  // 结果集输入到IntoRel中,新建的表中
                        --> QueryRewrite
                        --> pg_plan_query
                            --> standard_planner
                                --> subquery_planner
                                    --> grouping_planner
                                        --> query_planner
                                            --> make_one_rel
                                --> create_plan
                                    --> create_scan_plan
                        --> CreateQueryDesc  /* Create a QueryDesc, redirecting output to our tuple receiver */
                        --> ExecutorStart
                        --> ExecutorRun
                            --> standard_ExecutorRun
                                // 1. 建表
                                --> intorel_startup
                                    --> create_ctas_internal    //Actually create the target table
                                        --> DefineRelation // 建表
                                            --> heap_create_with_catalog
                                                --> heap_create
                                        --> StoreViewQuery  // Use the rules system to store the query for the view.
                                            --> UpdateRangeTableOfViewParse 
                                            --> DefineViewRules
                                                --> DefineQueryRewrite  // Set up the ON SELECT rule.
                                                    --> InsertRule // 插入的规则,重写为新的物化表,并不是源表
                                    --> SetMatViewPopulatedState
                                // 2. 执行查询语句,结果集存入物化的表中
                                --> ExecutePlan
                                    --> ExecScan    // 扫描获取tuple
                                        --> ExecScanFetch
                                            --> SeqNext
                                                --> table_beginscan
                                    --> intorel_receive  // receive one tuple
                                        --> table_tuple_insert  // 将查询到的tuple slot插入到创建的表中
                                            --> heapam_tuple_insert
                                                --> ExecFetchSlotHeapTuple
                                                    --> tts_buffer_heap_materialize
                                                        --> heap_copytuple
                                                    --> tts_buffer_heap_get_heap_tuple
                                                --> heap_insert // 插入到表中,找到指定的page,插入tuple。
                                                    --> heap_prepare_insert
                                                    --> RelationPutHeapTuple    
                        --> ExecutorEnd

--> PortalDrop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端考试总结

1HTML标签 h标题标签 块级标签 独占一行 p段落标签 同上 br换行标签 单标签 img图片标签 内联标签:不独占一行(src图片地址 alt图片的替代文字 title鼠标悬停提示文字) a超链接标签 同上 (href跳转路径 target属性{_blank新窗口打开 _self在当前窗口打开}) 列表标签(ul无…

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望

诺贝尔物理学奖与机器学习、神经网络:一场跨时代的融合与展望 机器学习与神经网络的崛起 机器学习与神经网络的发展前景 机器学习和神经网络的研究与传统物理学的关系 总结 2024年,诺贝尔物理学奖颁给了机器学习与神经网络,这一具有里程碑…

JAVA就业笔记5——第二阶段(2)

课程须知 A类知识:工作和面试常用,代码必须要手敲,需要掌握。 B类知识:面试会问道,工作不常用,代码不需要手敲,理解能正确表达即可。 C类知识:工作和面试不常用,代码不…

房屋租赁管理系统|基于java和小程序的房屋租赁管理系统小程序设计与实现(源码+数据库+文档)

房屋租赁管理系统小程序 目录 基于java和小程序的房屋租赁管理系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板,当页面没有指定 Layout 时,会自动调用此默认模板‌,如果要取消 在当页面设定 (如下),则表示 当前页面…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP+MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密,其他开源可二开 演示源码下载 开…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

包子凑数

类似完全背包求方案数&#xff0c;再加上点数论知识&#xff0c;裴蜀定理。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n const int N300000; bool f[N]; int a[120]; signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.…

华为ICT大赛2024-2025网络赛道考试分析

华为ICT大赛2024-2025正在报名中&#xff0c;网络赛道的同学如何备考&#xff0c;了解考试内容呢&#xff1f; 一、考试概况 华为ICT大赛分为4个赛段&#xff0c;分别为省赛初赛、省赛复赛、中国总决赛&#xff0c;全球总决赛。其中对应的能力级别分别如下&#xff1a; 省赛…

PHP爬虫API:获取商品详情的新利器

为什么选择PHP爬虫API 灵活的数据处理&#xff1a;PHP强大的数据处理能力&#xff0c;使得从API获取的数据可以被快速地处理和分析。丰富的库支持&#xff1a;PHP拥有如cURL、Guzzle等库&#xff0c;这些库简化了HTTP请求的发送和响应的接收。易于集成&#xff1a;PHP作为服务…

无人机搭载激光雷达在地形测绘中的多元应用

一、高精度地形测量 无人机激光雷达能够发射激光脉冲并接收其回波&#xff0c;通过精确计算激光脉冲的往返时间来确定目标物的距离。这一特性使得无人机激光雷达在地形测绘中能够实现高精度的三维地形测量。通过快速获取大量地形数据&#xff0c;可以生成高精度的数字高程模型…

pytorh学习笔记——cifar10(一)生成数据

CIFAR&#xff08;Canadian Institute For Advanced Research&#xff09;是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集&#xff0c;最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像&#xff0c;分为10个类别&#xff0c;每…

SpringCloud无介绍快使用,单机Eureka服务注册中心cloud-eureka-server7001搭建(十)

TOC 问题背景 从零开始学springcloud微服务项目 注意事项&#xff1a; 约定 > 配置 > 编码IDEA版本2021.1这个项目&#xff0c;我分了很多篇章&#xff0c;每篇文章一个操作步骤&#xff0c;目的是显得更简单明了controller调service&#xff0c;service调dao项目源码以及…

Python学习的自我理解和想法(17)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第17天&#xff0c;学的内容是面向对象设计。开学了&#xff0c;时间不多&#xff0c;写得不多&#xff0c;见谅。 目录 1.面向对象入门 …

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务&#xff0c;同时提高餐厅的运营效率。系统后端采用PHP语言开发&#xff0c;利用MySQL数据库进行数据存储与管理&#xff0c;实现了用户注册登录、菜品浏览、购物车管理、订单提…

es kibana .logstash离线集群安装

es离线集群安装 下载对应的版本一般看你客户端引用的是什么版本我这里下载的是7.6.2 官方下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 源码安装-环境准备&#xff1a;在etc/hosts文件添加3台主机 node-001 192.168.1.81 node-002 19…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序&#xff1a;miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致&#xff0c;老是切来切去。而且同一个人开发上传需要打包…

求最大公约数(c语言)

先看题&#x1f447; 我这里介绍的方法&#xff1a;辗转相除法&#xff1a; 最大公约数&#xff1a; 最大公约数是指同时能整除俩个或更多整数的最大正整数。 欧几里得算法就是求最大公约数的算法 求最大公约数涉及到一个数学原理的转换: 俩个数的最大公约数等于其中一个数和…

关于我、重生到500年前凭借C语言改变世界科技vlog.7——数组函数实践

文章目录 扫雷游戏专题1.扫雷游戏的设计分析1.1 棋盘1.2 文件 2.扫雷游戏的实现3.扫雷游戏的扩展 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 扫雷游戏专题 掌握了前面的数组与函数的知识&#xff0c;我们可以制作一款大多电脑上都有的简易…