物化视图
来自 PostgreSQL wiki
跳转到导航跳转到搜索物化视图已在 **PostgreSQL 9.3 中实现**,此前它们曾在 用户调查中被评为**最受欢迎的功能**。
Postgres 9.3 之前的版本
在早期版本中,可以使用数据库的触发器功能构建物化视图。一些可用的实现包括
- PostgreSQL 物化视图 by Jonathan Gardner。
- 真正有效的物化视图 by Dan Chak。
添加内置物化视图
自至少 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