【PostgreSQL技巧】PostgreSQL中的物化视图与汇总表比较

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 【PostgreSQL技巧】PostgreSQL中的物化视图与汇总表比较

多年来,物化视图一直是Postgres期待已久的功能。他们最终到达了Postgres 9.3,尽管当时很有限。在Postgres 9.3中,当刷新实例化视图时,它将在刷新时在表上保持锁定。如果您的工作量是非常繁忙的工作时间,则可以工作,但是如果您要为最终用户提供动力,那么这将是一个大问题。在Postgres 9.4中,我们看到了Postgres实现了同时刷新实例化视图的功能。现在,我们已经完全烘焙了物化视图的支持,但即使如此,我们仍然看到它们可能并不总是正确的方法。

什么是视图view?

对于那些不是数据库专家的人,我们将做一点备份。要了解什么是实体化视图,我们首先来看一个标准视图。视图是已定义的查询,您可以像表一样对其进行查询。当您具有通常用于某些标准报表/构建块的复杂数据模型时,视图特别有用。稍后我们将介绍一个实例化视图。

视图非常适合简化复杂SQL的复制/粘贴。缺点是每次执行视图时都会重新计算结果。对于大型数据集,这可能会导致扫描大量数据,使缓存无效,并且通常速度较慢。输入实例化视图

物化你的视图

让我们从一个可能包含大量原始数据的示例架构开始。在这种情况下,一个非常基本的网络分析工具会记录综合浏览量,发生时间和用户的会话ID。

CREATE TABLE pageviews ( id bigserial, page text, occurred_at timestamptz, session_id bigint );

基于这些原始数据,有很多不同的视图可能非常普遍。而且,如果我们有一个实时仪表板,我们将为它提供动力,因为它可能花费很长时间来查询原始数据,因此很快变得不可行。相反,我们可以对物化视图进行一些汇总:

CREATE MATERIALIZED VIEW rollups AS SELECT date_trunc('day') as day, page, count(*) as views FROM pageviews GROUP BY date_trunc('day'), page;

对于每天至少浏览一次的页面,这将为我们每天提供1条记录。

对于每天晚上批处理的事情,可以处理前一天的事情。但是对于面对客户的事情,您可能不希望等到一天结束后再提供有关网页浏览量如何进行分析的信息。当然,您可以定期刷新一次:

refresh materialized view rollups;

这种刷新方式的缺点是每次刷新时都会重新计算当天的总数,这实际上是在进行不必要的处理。

为了可扩展性增量汇总

另一种方法是使用upsert,它使我们能够增量汇总数据而不必重新处理所有基础数据。Upsert本质上是创建或更新。为此,我们将创建一个表而不是物化视图,然后在其上施加唯一约束:

CREATE TABLE ( day as timestamptz, page text, count as bigint, constraint unq_page_per_day unique (day, page) );

现在开始汇总,我们将执行以下操作:

INSERT INTO rollups SELECT date_trunc('day') as day, page, count(*) as views FROM pageviews GROUP BY date_trunc('day'), page;

这基本上与我们的物化视图相同。但是由于我们的独特限制,当遇到已经插入的记录时,插入会出错。为了完成这项工作,我们将调整查询以完成两件事。一项我们将只处理新记录,另一项我们将使用upsert语法。

为了处理新记录,我们将保留上次停止记录的记录,仅处理新记录。我们在本文中概述了一组方便使用的函数/表。使用适当的函数和表格来跟踪我们上次中断的位置,现在我们将查询更新为仅汇总自上次处理后的数据。然后,我们将其与upsert结合在一起。upsert将尝试插入当天/页面的任何新记录,如果已经看到这些值,则将增加它们:

INSERT INTO rollups SELECT day, page, count(*) as views FROM pageviews WHERE event_id > e GROUP BY day, page ON CONFLICT (day, page) DO UPDATE SET views = views + EXCLUDED.views;

物化视图与汇总表哪个正确?

物化视图是一种非常简单直接的方法。它们的易用性使它们成为快速简便的事情的理想选择。但是,对于具有较大活动负载的较大数据集和数据库,仅处理上一次汇总的净新数据可以更有效地利用资源。哪种方法最合适取决于时间和系统资源。尽管如您所见,汇总方法仅需要一点点努力,并且可以进一步扩展。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
727 0
|
存储 安全 关系型数据库
PostgreSQL物化视图增量更新扩展 -- pg_ivm
PostgreSQL不支持物化视图增量更新,需要定期执行REFRESH MATERIALIZED VIEW命令刷新物化视图。Incremental View Maintenance (IVM)是一种使物化视图保持最新的方法,其中只计算增量更改并将其应用于视图,而不是REFRESH MATERIALIZED VIEW那样从头开始重新计算内容。当只更改视图的一小部分时,IVM可以比重新计算更高效地更新物化视图。
|
6月前
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之PostgreSQL版是否直接支持实时物化视图
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
134 3
|
6月前
|
SQL 关系型数据库 PostgreSQL
【sql】PostgreSQL物化视图表使用案例
【sql】PostgreSQL物化视图表使用案例
60 0
|
SQL Oracle 关系型数据库
物化视图(Oracle与PostgreSQL对比)
物化视图(Oracle与PostgreSQL对比)
|
7月前
|
SQL 运维 关系型数据库
基于AnalyticDB PostgreSQL的实时物化视图研发实践
AnalyticDB PostgreSQL版提供了实时物化视图功能,相较于普通(非实时)物化视图,实时物化视图无需手动调用刷新命令,即可实现数据更新时自动同步刷新物化视图。当基表发生变化时,构建在基表上的实时物化视图将会自动更新。AnalyticDB PostgreSQL企业数据智能平台是构建数据智能的全流程平台,提供可视化实时任务开发 + 实时数据洞察,让您轻松平移离线任务,使用SQL和简单配置即可完成整个实时数仓的搭建。
144009 8
|
存储 关系型数据库 数据库
《PostgreSQL物化视图:创建、维护与应用》
《PostgreSQL物化视图:创建、维护与应用》
138 0
|
存储 SQL Oracle
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
快速学习10 PostgreSQL 表级复制-物化视图篇,支持异地,异构如 Oracle 到 pg 的物化视图
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
|
关系型数据库 PostgreSQL 索引
postgresql 物化视图
postgresql 物化视图的使用介绍
505 0
|
SQL 关系型数据库 OLAP
【实操系列】AnalyticDB PostgreSQL 万倍查询加速——使用实时物化视图加速带可变参数的查询
以TPCH Q1为例,介绍一个优化案例,使用AnalyticDB PostgreSQL的实时物化视图+自动查询改写,近万倍优化带可变参数的OLAP查询
697 1
【实操系列】AnalyticDB PostgreSQL 万倍查询加速——使用实时物化视图加速带可变参数的查询
下一篇
DataWorks