Postgres 物化视图:功能、问题及正确使用方法

2024-10-23
来源:网络整理

物化视图多年来一直是人们期待已久的功能。他们最终达到了 9.3,尽管当时还很有限。在9.3中,当刷新物化视图时,它会在刷新时持有表上的锁。如果您的工作负载非常繁忙,这可能会起作用,但如果您为最终用户提供支持,这将是一个大问题。在 9.4 中,我们看到了同时刷新物化视图的能力。现在,我们已经完全支持物化视图,但即便如此,我们仍然发现它们可能并不总是正确的方法。

什么是视图?

对于那些不是数据库专家的人,我们会做一些备份。要了解什么是物化视图,我们首先看一下标准视图。视图是定义的查询,您可以像表一样查询它们。当您拥有经常用于某些标准报告/构建块的复杂数据模型时,视图特别有用。稍后我们将介绍物化视图。

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

实现你的观点

让我们从一个可能包含大量原始数据的示例模式开始。在这种情况下,一个非常基本的网络分析工具将记录页面浏览量、页面浏览量发生的时间以及用户的会话 ID。

( id , 页面文本, , );

基于这些原始数据,有许多可能很常见的不同观点。如果我们有一个实时仪表板,我们将为它提供动力,因为查询原始数据可能需要很长时间,以至于很快就变得不可行。相反,我们可以对物化视图进行一些聚合:

VIEW AS ('day') as day, page, (*) as FROM BY ('day'), page;

这将为我们每天至少查看一次的页面提供 1 条记录。

对于每晚批量处理的事情,可以处理前一天的事情。但对于面向客户的内容,您可能不想等到一天结束才提供有关如何分析页面浏览量的信息。当然,你可以定期刷新它:

看法 ;

微信公众号做网页_微信公众号网页视图_视图公众网页微信号怎么登录

这种刷新方式的缺点是每次刷新时都会重新计算当天的总计,这本质上是不必要的处理。

增量汇总以实现可扩展性

另一种方法是使用 ,它允许我们增量聚合数据,而无需重新处理所有底层数据。本质上是创建或更新。为此,我们将创建一个表而不是物化视图,然后对其施加唯一约束:

(日为,页面文本,为,(日,页));

现在要开始聚合,我们将执行以下操作:

INTO ('day') 为日、页,(*) 为 FROM BY ('day')、页;

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

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

INTO 日,页,(*) 为 FROM > e BY 日,页 ON (日,页) DO SET = + .;

物化视图和汇总表哪一个是正确的?

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

微信公众号

分享