参考:PostgreSQL12 - Chapter 40. The Rule System
- 规则Rule
- 视图View
- 物化视图Material View
- 外部数据包装器 Foreign Data Wrapper
视图的外观:
一个视图是对应于一个SQL查询语句的一个名称,该名称可以像表名一样用于查询(不能用于增删改);视图只保存SQL查询语句,不保存数据。
视图的创建语句如下:
CREATE
视图的内部实现:
实际上,以上视图创建语句的内部实现如下:
CREATE
这种实现方式有一些副作用。其中一个副作用是:PostgreSQL 系统目录中有关视图的信息与表的信息完全相同。因此,对于解析器,表和视图之间完全没有区别,它们是一回事:关系(relation)。
(待续...)
上面演示了规则系统如何将视图定义合并到原始查询树中。在第二个示例中,一个视图中的简单 SELECT 创建了一个最终查询树,该树是 4 个表的联接(单位使用两次,名称不同)。
使用规则系统实现视图的好处是:规划器拥有有关必须扫描哪些表的所有信息,以及这些表之间的关系,以及视图的限制性限定以及单个查询树中的原始查询。当原始查询已经是联接视图时,这种情况仍然存在。规划者必须决定哪个是执行查询的最佳路径,并且规划器拥有的信息越多,这个决定就越好。在 PostgreSQL 中实现的规则系统可确保,至此,有关查询的所有可用信息。
物化视图
物化视图的外观:
物化视图,和视图一样一个SQL查询语句对应的一个名称,可以像表名一样用于查询;但是物化视图会将结果像表一样保存起来,物化视图后续无法直接更新数据;
--物化视图和表的区别
物化视图的内部实现:
物化视图,和视图一样通过规则系统实现;用于创建物化视图的查询语句与创建视图的查询语句,两者的保存方式完全相同。
PostgreSQL 系统目录中,有关物化视图的信息与表/视图的信息完全相同。因此,对于解析器来说,物化视图和表/视图一样,是一个关系。在查询中引用物化视图时,数据直接从物化视图返回,就像从表中返回数据;规则仅用于填充物化视图。
对存储在物化视图中的数据的访问,通常比直接访问基础表或通过视图访问基础表快得多,但是,数据并不总是最新的。
物化视图的用途:
1 有些使用场景中不需要当前最新数据。
--考虑记录销售额的表:
2 物化视图的另一个用途是:允许通过FDW更快地访问从远程系统传递的数据。
下面列出了一个使用file_fdw(带计时)的简单示例,但由于这是使用本地系统上的缓存,因此与访问远程系统相比的性能差异通常大于此处所示。请注意,我们还利用了在物化视图上放置索引的能力,而 file_fdw 不支持索引;这种优势可能不适用于其他类型的FDW。
--创建fdw