物化视图

来自 PostgreSQL wiki
跳转到导航跳转到搜索

物化视图已在 **PostgreSQL 9.3 中实现**,此前它们曾在 用户调查中被评为**最受欢迎的功能**

Postgres 9.3 之前的版本

在早期版本中,可以使用数据库的触发器功能构建物化视图。一些可用的实现包括

添加内置物化视图

自至少 2003 年起,将 MV 支持内置到数据库中一直是积极讨论的话题。主要需要的组件可以分为三个部分

1. 创建物化视图

  • 当前状态:使用 "CREATE TABLE AS" 或类似机制,手动维护
  • 理想状态:"CREATE MATERIALIZED VIEW" 语法,用于存储 MV 数据的元数据,转储/重新加载支持

2. 更新物化视图

  • 当前状态:定期创建新的快照,或使用触发器进行维护
  • 理想状态:通过多种策略内置刷新,并尽可能减少锁定以提高并发访问

3. 在计划程序中使用物化视图

  • 当前状态:在可以使用它的查询中指定手动创建的 MV
  • 理想状态:自动加速可以使用可用 MV 代替的查询

先前的工作

实现

FlexViews 和 Oracle 似乎都使用更改跟踪/复制系统作为增量更新视图的基础。一旦这样的系统就位,您就可以检查更改以确定它们是否影响物化视图,如果是,则需要更新视图的哪些行。然后,可以对视图进行子选择以将新行插入到支持视图的表中。

因此,对于每个视图,您都需要能够将原始选择转换为一个算法,该算法接收一个更改(或更改列表)并输出要更新的视图中的行范围。更新最好通过发出 DELETE 和 SELECT INTO 或更低级别的等效项来完成。这将触发对任何附加索引的更新。

示例 / 用例

CREATE TABLE vec (id INTEGER PRIMARY KEY, a INTEGER, b INTEGER)
CREATE MATERIALIZED VIEW hypot AS SELECT sqrt(a*a + b*b) as c

=> Add primary key id:INTEGER to hypot
=> INSERT INTO hypot (c) SELECT sqrt(a*a + b*b) FROM vec
=> ON UPDATE/INSERT/DELETE vec:
     DELETE FROM hypot WHERE hypot.id = ROW.id
     INSERT INTO hypot (c) SELECT sqrt(a*a + b*b) FROM vec WHERE vec.id = row.id