暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL自动更新物化视图

飞象数据 2019-08-30
1974

物化视图是从数据库中检索信息的便捷方法。与普通视图不同,物化视图可以保存查询结果并提供对数据的更快访问。例如,用户可以创建一个包含表中行数的简单物化视图:

 CREATE MATERIALIZED VIEW mv1 AS SELECT count(*) FROM pgbench_accounts;  

使用物化视图mv1获取行数远比直接访问pgbench_accounts中的行数要快得多。

test=# SELECT * from v1; count  -------- 100000(1 row)Time: 0.810 mstest=# SELECT count(*) FROM pgbench_accounts; count  -------- 100000(1 row)Time: 13.945 ms

但是,如果从pgbench_accounts中删除一行,则mv1中的行数仍保持不变。要反映基表的更改(在本例中为pgbench_accounts),您需要重新创建或刷新(这实际上是从头开始重新创建物化视图的内容),这可能需要很长时间。

为了解决这个问题,SRA OSS建议在现有的物化视图“增量物化视图维护”中添加一个新功能。像这样的。

  • 添加新语法以允许在创建物化视图时逐步更新它。

  • 自动安装触发器以附加到基表。

  • 当UPDATE DELETE INSERT应用于基表时,触发器计算物化视图中行的差异并更新行。

这些应该以实时方式更新物化视图。开销是触发器调用的首要问题。因此,频繁更新表不是增量物化视图维护的最佳选择。以下是如何使用增量更新物化视图的演示。

首先创建逐步更新物化视图。

CREATE INCREMENTAL MATERIALIZED view mv2 AS SELECT count(*) FROM pgbench_accounts

该视图最初表示有100,000行。

SELECT * FROM mv2; count  -------- 100000(1 row)

从pgbench_accounts中删除一行。现在行数是99999.  

DELETE FROM pgbench_accounts WHERE aid = 10;DELETE 1SELECT count(*) FROM pgbench_accounts; count ------- 99999(1 row)

确保mv2报告的行数相同。

SELECT * FROM mv2; count ------- 99999(1 row)

它有效!

这是一个非常简单的物化视图。更复杂的查询,例如内部联接也可以。

CREATE INCREMENTAL MATERIALIZED VIEW mv3 AS SELECT a.aid, b.bid, t.tid FROM pgbench_accounts a INNER JOIN pgbench_branches b ON (a.bid = b.bid ) INNER JOIN pgbench_tellers t ON (b.bid = t.bid) WHERE a.aid BETWEEN 1 AND 5;SELECT 50SELECT * FROM mv3 LIMIT 5; aid | bid | tid-----+-----+-----   3 |   1 |  10   2 |   1 |   1   2 |   1 |   5   2 |   1 |   4   5 |   1 |   3 (5 rows)DELETE FROM pgbench_accounts WHERE aid = 2;DELETE 1SELECT * FROM mv3 LIMIT 5; aid | bid | tid-----+-----+-----   3 |   1 |  10   5 |   1 |   3   1 |   1 |   1   5 |   1 |   8   4 |   1 |   3
(5 rows)

实现其他类型的查询,例如外连接,自连接,也在我们的计划中,可能是针对PostgreSQL 13.  


本文翻译自:http://pgsqlpgpool.blogspot.com/2019/08/automatically-updating-materialized.html

文章转载自飞象数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论