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

postgresql|数据库|提升查询性能的物化视图解析

前言:

我们一般认为数字的世界是一个虚拟的世界,OK,但我们其实有些需求是和现实世界一模一样的,比如,数据库尤其是关系型数据库,希望在使用的数据库能够更快(查询速度),更高(性能上限更高),更强(并发性能,写能力这些属性),正如奥林匹克的体育精神:更快,更高,更强,但是很可惜,愿望就是愿望了,要想实现这样的愿望需要更多的技术,想法。

那么,毫无疑问的,物化视图是一个专门针对查询性能的关系型数据库内的一个对象。

等等,视图?物化视图?

是的,就是物化视图,我只能告诉大家一个残酷的事实(结论先给了,不服气的接着看),物化视图虽然可以对数据库的查询性能起到一个比较大的提升,但物化视图有很大的局限性,也可以简单的理解为物化视图是一个双刃剑,用好了可以使得数据库系统查询速度飞快,用不好可能会造成系统崩溃这样的惨烈后果。

下面,我将就物化视图的优缺点,适用场景,如何使用物化视图做一个简单的介绍。

一,

物化视图是什么?

###注:基表,也就是基础表,查询结果不是凭空出现的,自然是从一个或者N个表内查询得出的结果,一个或者N个表也就省略称之为基表了

物化视图是介于表和视图之间的一个关系型数据库的对象,可以将它想象成一个查询基表产生的结果集,但这个结果集可以很复杂,可以是多表联查的结果集,可以是一个简单的单表查询结果集。

和普通视图相比,更为关键的是,物化视图是有对应的存放于$PGDATA目录下的物理文件,也就是它不是一个虚幻的虚拟的东西了,而是一个真真切切存在的可操作的对象了,这也是为什么叫物化视图的原因了。

那么,很多同学就会有疑问了:普通视图也是一个基于基表的查询而产生的结果集,为毛要用什么物化视图?有毛病吗?

OK,普通视图是无法添加索引的,而我们都知道索引是可以加快查询速度的,也就是基于合适的索引,我们是可以加快查询效率的,因此,一个设计良好的物化视图的查询速度会远远超过一个设计良好的普通视图

和表相比,物化视图仅仅是一个查询结果集,那自然是没有insert,update这些功能了,也就是说,物化视图不可改变其内的数据。

当然,在navicat里,这个物化视图叫实体化视图,目前只需要明白一点,叫什么都无所吊谓的

二,

物化视图的优缺点和适用场景

OK,现在来总结一下物化视图的优缺点

优点:

  1. 提高性能:通过预先计算并存储结果,可以避免在每次查询时都需要执行复杂的联接操作或聚合运算,从而大大提高查询速度。
  2. 减少磁盘空间:由于物化视图只存储部分数据,而不必存储所有基础表的所有数据,因此可以减少磁盘空间的需求。
  3. 支持快速数据刷新:大多数数据库系统都支持物化视图的快速刷新,可以在较短的时间内更新物化视图中的数据,以便及时反映底层数据的变化。
  4. 物化视图可以添加索引,而索引可以有效的提升查询效率

缺点:

  1. 需要额外的存储空间:物化视图需要占用额外的磁盘空间来存储其结果集。
  2. 更新延迟:由于物化视图通常需要定期刷新,因此在底层数据发生变化后,可能需要一段时间才能反映到物化视图中。因此,如果是经常更新的基表,而对物化视图的准确性有较高的要求的情况下,更新需求会是一个不得不考虑的问题,so,建议基表更新太多的基表不建议使用物化视图
  3. 维护复杂性:由于物化视图需要定期刷新,而且在某些情况下还需要执行复杂的计算,因此需要更多的硬件资源提供支持。
  4. 不适合高并发环境:在高并发环境下,如果多个用户同时访问物化视图,可能会出现锁竞争问题,影响性能。主要原因是在刷新或者说同步物化视图这样的操作的时候,会有锁的问题。

由于这些优缺点,因此,可以得出物化视图并不是万能的,很有可能是一个双刃剑,物化视图需要在一个适用的环境下才可以使用。
OK,物化视图的适用场景一般为:

  1. 基表更新不是非常频繁,这个可以有一些时间上的量化,例如,更新条目在分钟级附近。
  2. 相对物化视图来说,并发程度不是太高,多用户同时查询不会影响到物化视图的更新正常完成。
  3. 数据库的硬件条件比较高,可以承担物化视图的频繁更新,主要是CPU和内存能够满足物化视图的刷新任务
  4. 对外提供数据,例如A向B提供数据,A这边按规做好物化视图,并确定合适的刷新物化视图规则,就可以以合规数据形式提供给B了。
  5. 某些复杂查询,应用的频率比较高。

三,

物化视图的创建

CREATE MATERIALIZED view 物化视图名称 as 查询语句 with DATA

说明:with后接data或者no data,no data表示不填充此物化视图,仅仅生成数据结构,默认是with data

下面就以pgbench的一个表pgbench_accounts为例来说明物化视图的创建和管理

创建物化视图

CREATE MATERIALIZED view vvv as SELECT * FROM pgbench_accounts;

查看物化视图: 

OK,此时如果基表pgbench_accounts 改变了的话,物化视图vvv并不会跟随改变,因为规定必须是刷新(同步)pgbench_accounts这个表

修改基本的aid等于48的 abalance值为123456789,修改后查询确认是修改了

UPDATE pgbench_accounts set abalance='123456789' WHERE aid='48' 
SELECT * from pgbench_accounts where aid='48'

 此时查询物化视图vvv,可以看到aid 48 并没有改变:

手动刷新该物化视图:

refresh MATERIALIZED VIEW  vvv with data;

还一种刷新是不影响现有物化视图使用的,也就是不加锁的并行刷新,如果该物化视图比较大的时候:

REFRESH MATERIALIZED VIEW CONCURRENTLY vvv

 但此时这样刷新会报错:

REFRESH MATERIALIZED VIEW CONCURRENTLY vvv
> ERROR:  cannot refresh materialized view "public.vvv" concurrently
HINT:  Create a unique index with no WHERE clause on one or more columns of the materialized view.

此时需要给物化视图添加一个唯一索引,在本例中就给aid添加吧,注意,也是并行添加索引  CONCURRENTLY,:

CREATE UNIQUE INDEX  CONCURRENTLY vvvv ON vvv(aid)

 再次查询可以看到物化视图与基表同步了:

 

 四,

物化视图的自动刷新

物化视图的自动更新需要安装一些特殊的插件例如Apache iceberg(冰山)或者是自己手动创建触发器函数+触发器这样的形式,本例中是触发器函数+触发器

触发器-函数的创建(触发器 触发后要执行的函数,这里自然是刷新物化视图啦):

CREATE OR REPLACE FUNCTION update_my_view()
RETURNS TRIGGER AS $$
DECLAREBEGIN-- Update the materialized view here.REFRESH MATERIALIZED VIEW  CONCURRENTLY vvv;RETURN NULL;END;
$$ LANGUAGE plpgsql;

触发器的创建(此触发器是基于基表的哦):

CREATE TRIGGER update_my_view_trigger
AFTER INSERT OR UPDATE OR DELETE ON pgbench_accounts
FOR EACH STATEMENT
EXECUTE PROCEDURE update_my_view();

OK,现在可以验证了,首先,基表更新,aid 48 更新为888888,删除aid 47:

UPDATE pgbench_accounts set abalance='888888' WHERE aid='48' 
DELETE from pgbench_accounts where aid='47'

这个时候查询物化视图,可以看到我们并没有执行刷新命令就可以看到物化视图的改变了:

pgbench=# SELECT * from vvv where aid='47';aid | bid | abalance | filler 
-----+-----+----------+--------
(0 rows)pgbench=# SELECT * from vvv where aid='48';aid | bid | abalance |                                        filler                                        
-----+-----+----------+--------------------------------------------------------------------------------------48 |   1 |   888888 |                                                                                     
(1 row)

OK,自动刷新物化视图是成功的

五,

物化视图的修改

更改物化视图基本和更改表一样的语法,例如,更改物化视图的名称,这里需要注意,如果有触发器,那么,触发器函数也应该同时更改,否则触发器会报错的哦:

ALTER MATERIALIZED VIEW IF EXISTS  vvvRENAME TO vvvvvv
UPDATE pgbench_accounts set abalance='8888882' WHERE aid='48'
> ERROR:  relation "vvv" does not exist
CONTEXT:  SQL statement "REFRESH MATERIALIZED VIEW  CONCURRENTLY vvv"
PL/pgSQL function update_my_view() line 5 at SQL statement

其它的修改就不一一举例了:

ALTER MATERIALIZED VIEW [ IF EXISTS ] nameaction [, ... ]
ALTER MATERIALIZED VIEW nameDEPENDS ON EXTENSION extension_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] nameRENAME [ COLUMN ] column_name TO new_column_name
ALTER MATERIALIZED VIEW [ IF EXISTS ] nameSET SCHEMA new_schema
ALTER MATERIALIZED VIEW ALL IN TABLESPACE name[ OWNED BY role_name [, ... ] ]SET TABLESPACE new_tablespace [ NOWAIT ]


 

相关文章:

postgresql|数据库|提升查询性能的物化视图解析

前言: 我们一般认为数字的世界是一个虚拟的世界,OK,但我们其实有些需求是和现实世界一模一样的,比如,数据库尤其是关系型数据库,希望在使用的数据库能够更快(查询速度),…...

Unity中Shader雾效的原理

文章目录 前言一、我们先看一下现实中的雾二、雾效的混合公式最终的颜色 lerp(雾效颜色,物体颜色,雾效混合因子) 三、雾效的衰减1、FOG_LINEAR(线性雾衰减)2、FOG_EXP(指数雾衰减1)3、FOG_EXP(指数雾衰减2) 前言 Unity中Shader雾…...

chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上:逻辑/连贯性细节上一些具体的修改例子 一些建议,包括具体的提问范例1. **明确你的需求**2. **提供上下文信息**3. **明确问题类型**4. **测试不同建议**5. **请求详细解释**综合提问范例&…...

Vue3 源码解读系列(二)——初始化应用实例

初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事: 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象,延时创建渲染器,优点是当用户只依赖响应式包的时候&#xff0…...

网络原理-UDP/TCP详解

一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段&#xff0…...

C#多线程入门概念及技巧

C#多线程入门概念及技巧 一、什么是线程1.1线程的概念1.2为什么要多线程1.3线程池1.4线程安全1.4.1同步机制1.4.2原子操作 1.5线程安全示例1.5.1示例一1.5.2示例二 1.6C#一些自带的方法实现并行1.6.1 Parallel——For、ForEach、Invoke1.6.1 PLINQ——AsParallel、AsSequential…...

c primer plus_chapter_four——字符串和格式化输入/输出

1、strlen();const;字符串;用c预处理指令#define和ANSIC的const修饰符创建符号常量; 2、c语言没有专门储存字符串的变量类型,字符串被储存在char类型的数组中;\0标记字符串的结束&a…...

Python Fastapi+Vue+JWT实现注册、登录、状态续签【登录保持】

文章目录 一、实现流程1.注册2.登录3.登录保持【状态续签】二、实现方法1.注册2.登录+登陆状态保持* 后端部分* 前端部分一、实现流程 1.注册 Created with Raphal 2.3.0...

oracle-sql语句解析类型

语句执行过程:1. 解析(将sql解析成执行计划) 2.执行 3.获取数据(fetch) 1. shared pool的组成。 share pool是一块内存池。 主要分成3块空间。free, library(库缓存,缓存sql以及执行计划),row cache(字典缓存) select * from v…...

2023 年最新企业微信官方会话机器人开发详细教程(更新中)

目标是开发一个简易机器人,能接收消息并作出回复。 获取企业 ID 企业信息页面链接地址:https://work.weixin.qq.com/wework_admin/frame#profile 自建企业微信机器人 配置机器人应用详情 功能配置 接收消息服务器配置 配置消息服务器配置 配置环境变量…...

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat:用于各种音视频[封装…...

c语言:用指针解决有关字符串等问题

题目1&#xff1a;将一个字符串str的内容颠倒过来&#xff0c;并输出。 数据范围&#xff1a;1≤len(str)≤10000 代码和思路&#xff1a; #include <stdio.h> #include<string.h> int main() {char str1[10000];gets(str1);//读取字符串内容char* p&str1[…...

吃透 Spring 系列—Web部分

目录 ◆ Spring整合web环境 - Javaweb三大组件及环境特点 - Spring整合web环境的思路及实现 - Spring的web开发组件spring-web ◆ web层MVC框架思想与设计思路 ◆ Spring整合web环境 - Javaweb三大组件及环境特点 在Java语言范畴内&#xff0c;web层框架都是基于J…...

JAVA后端服务端与移动端客户端高精度时间同步思路

一、脑补 在Chrome--->Network----> Timing中可以查看一个请求在各个阶段所花费的时间。 Timing中各个字段的意思发&#xff1a; 1、Queueing&#xff1a;从增加到等待处理队列到实际开始处理的时间间隔——浏览器也有线程机制&#xff0c;所有的请求不能同时发送&…...

nsd的资料

nsd是一款开源的DNS服务器应用。 近期参与项目过程中&#xff0c;涉及到DNS业务&#xff0c;结果被打的满头包。 虽然在校学习时就知道DNS协议&#xff0c;但从业这么多年&#xff0c;对于DNS协议的理解其实一直处于一知半解的状态。 当前处理问题时&#xff0c;接触到了nsd&am…...

关于Maven中pom.xml文件不报错但无法导包解决方法

问题 我的pom文件没有报红&#xff0c;但是依赖无法正常导入。 右下角还总出现这种问题。 点开查看报错日志。大致如下 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method <init>()V no…...

使用决策树分类

任务描述 本关任务&#xff1a;使用决策树进行分类 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.使用决策树进行分类 使用决策树进行分类 依靠训练数据构造了决策树之后&#xff0c;我们可以将它用于实际数据的分类。在执行数据分类时&#xff0c;需要…...

STM32H563烧录后无法擦除

STM32H563烧录后无法擦除&#xff0c;使用STM32CubeProgrammer连接后显示如下图所示。...

2023最新最全【Adobe After Effection 2023】下载安装零基础教程【附安装包】

AE2023下载点这里 教学 1.鼠标右击【Ae2023(64bit)】压缩包选择&#xff08;win11系统需先点击“显示更多选项”&#xff09;【解压到 Ae2023(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Set-up】选择【以管理员身份运行】。 3.点击【文件夹图标】&#xff0c;…...

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...