PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

39.2. 视图与规则系统 #

39.2.1. SELECT 规则的工作原理
39.2.2. 非 SELECT 语句中的视图规则
39.2.3. 视图与重写系统的表现力
39.2.4. 可更新视图

在 PostgreSQL 中,普通视图在底层完全是由规则系统驱动实现的。一个视图在本质上是一张不具备任何物理磁盘数据存储的空关系表,并在其上附加了一条名为 _RETURN 的隐式 ON SELECT DO INSTEAD 规则。 因此声明一个视图:

CREATE VIEW myview AS SELECT * FROM mytab;

在系统底层的实际效果,等价于先创建具有相同列签名的空表,并为其绑定一条就地重写规则:当外部试图查询该视图时,规则系统拦截并将其就地直接替换为对底层基表 mytab 的实际检索查询。

通过在视图上进一步附加针对于 INSERT、UPDATE 或 DELETE 的 DO INSTEAD 规则,能够将对视图的写操作透明重写并路由分发到底层的一张或多张物理基表上,从而使复杂的连接视图同样具备完整的写能力。

39.2.1. SELECT 规则的工作原理 #

针对 ON SELECT 的规则作为最后一步应用于所有查询,即便原始命令是 INSERT、UPDATE 或 DELETE 也不例外。与其他命令类型的规则不同,SELECT 规则会就地直接修改查询树,而不是派生新的查询树。

当前 ON SELECT 规则中只允许存在单一动作,且必须是无条件的 INSTEAD SELECT 动作。该约束使得 ON SELECT 规则严格表现为视图。

39.2.2. 非 SELECT 语句中的视图规则 #

当在非 SELECT 语句(如 INSERT INTO ... SELECT 或带有子查询的更新)中引用视图时,系统同样会先在解析树中将视图替换为底层基表的子查询,再将结果传递给上层的修改命令执行。

39.2.3. 视图与重写系统的表现力 #

由于视图在系统内部被直接展开合并到底层查询树中,因此查询优化器能够将针对视图的外层条件(WHERE)、连接条件以及排序下推至底层基表扫描算子上,从而实现与直接手写基表查询完全一致的高性能执行计划。

39.2.4. 可更新视图 #

通过在视图上显式创建针对于 INSERT、UPDATE 或 DELETE 的规则(DO INSTEAD),可以将修改操作重定向到底层物理基表,使原本不可直接修改的复杂视图具备更新能力。