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

PostgreSQL 的实体化视图介绍

PostgreSQL 实体化视图提供一个强大的机制,通过预先计算并将查询结果集存储为物理表来提高查询性能。本教程将使用 DVD Rental Database 数据库作为演示例子,指导你在 PostgreSQL中创建实体化视图。

了解实体化视图

实体化视图是查询结果集的快照,以物理表的形式存储。与常规视图不同,实体化视图是虚拟的,每次被引用时都会执行底层查询,实体化视图能持久化数据,并通过定期刷新来提高查询性能。

相比于频繁的查询执行,实体化视图对于底层数据变化不频繁的场景是非常有用的。这使得它们成为报告、数据仓库和实时数据要求不严格的场景的理想选择。

设置 DVD Rental 数据库

在深入探讨实体化视图前,让我们先来设置 DVD Rental 数据库。它是 MySQL 常用的 Sakila 数据库样例的 PostgreSQL 版本。你可以从官方 PostgreSQL 教程网页(PostgreSQL Sample Database)上下载 DVD Rental 数据库。

数据库文件为 ZIP 格式(dvdrental.zip),所以在加载数据库样例到 PostgreSQL 数据库服务器前,你需要将它解压缩为 dvdrental.tar。解压为 .tar 文件后,创建名为“dvdrental”的新数据库,然后执行 pg_restore 命令以将 .tar 文件内容填充到 dvdrental 数据库中。

pg_restore -U postgres -d dvdrental D:\sampledb\postgres\dvdrental.tar

将上面的路径替换为你系统上指向已解压的 dvdrental.tar 路径。

你可以点击 此处 查看详细的安装说明。

创建实体化视图

假设我们想创建一个实体化视图,显示每个电影类别产生的总收入。以下是操作步骤:

  • 连接你的 PostgreSQL 数据库
  • 通过下面的 DML 语句创建实体化视图:
CREATE MATERIALIZED VIEW mv_category_revenue AS
SELECTc.name AS category,SUM(p.amount) AS total_revenue
FROMcategory cJOIN film_category fc ON c.category_id = fc.category_idJOIN film f ON fc.film_id = f.film_idJOIN inventory i ON f.film_id = i.film_idJOIN rental r ON i.inventory_id = r.inventory_idJOIN payment p ON r.rental_id = p.rental_id
GROUP BYc.name;

例子中,我们将 DVD Rental 数据库中多张表进行联合,以计算每个电影类别的总收入。

在 Navicat For PostgreSQL(或 Navicat Premium)16:

    • 点击“实体化视图”按钮,将显示实体化对象列表,在对象工具栏中点击“+ 新建实体化视图”,将打开视图设计器:

    • 在定义编辑器中输入上述语句的 SELECT 部分:

    • 我们可以点击“预览”按钮来检查语句是否可以如期运行:

    • 点击“保存”按钮,完成创建新的实体化视图。这将会弹出一个提示输入实体化视图名称的对话框,根据上面的 CREATE MATERIALIZED VIEW 语句中的名称,我们将它命名为“mv_category_revenue”:

    • 点击对话框中的保存按钮,Navicat 会将实体化视图名称从“无标题”改为我们提供的名称。同时也会将新建的实体化视图添加到左侧导航窗格的实体化视图列表中:

总结

在非实时数据场景下,PostgreSQL 实体化视图是一个优化查询性能的有用工具。通过预计算和存储复杂查询的结果,实体化视图可以显著提高分析和报告任务的响应时间。本教程中,我们学习了如何为 DVD Rental 数据库创建实体化视图,并展示了在真实场景中的实际应用。

往期回顾 

Navicat 16 已支持 Redis

Navicat 16 已支持华为云 GaussDB

Navicat 16 已支持蚂蚁集团 OceanBase 全线数据库

Navicat 常见技术教程

Navicat 入选中国信通院发布的《中国数据库产业图谱(2023)》 

相关文章:

  • android 15
  • 服务器丢包的原因及解决方法
  • Vue30 自定义指令 函数式 对象式
  • react18加antd新手上路使用
  • Golang 并发 Channel的用法
  • 智慧物业信息管理系统平台及APP建设项目
  • 第2讲:C语言数据类型和变量
  • 代理模式笔记
  • 【坑】Spring Boot整合MyBatis,一级缓存失效
  • 微服务三十五关
  • Windows 10 优化指南20240223
  • QT_day4
  • 深入理解Java单例模式
  • https://registry.npm.taobao.org淘宝npm镜像仓库地址更新
  • STM32F4XX - uart设置
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • CSS实用技巧
  • download使用浅析
  • leetcode386. Lexicographical Numbers
  • MaxCompute访问TableStore(OTS) 数据
  • PHP CLI应用的调试原理
  • windows-nginx-https-本地配置
  • 搞机器学习要哪些技能
  • 解析带emoji和链接的聊天系统消息
  • 聊聊sentinel的DegradeSlot
  • 七牛云假注销小指南
  • 如何胜任知名企业的商业数据分析师?
  • 优秀架构师必须掌握的架构思维
  • - 转 Ext2.0 form使用实例
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​人工智能书单(数学基础篇)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十五)使用Nexus创建Maven私服
  • (四) Graphivz 颜色选择
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)JAVA中的堆栈
  • (转)详解PHP处理密码的几种方式
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net Remoting常用部署结构
  • .NET 使用 XPath 来读写 XML 文件
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net8 Blazor 尝鲜
  • .NET框架设计—常被忽视的C#设计技巧
  • .sh 的运行