pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
PostgreSQL 提供了一个强大的 规则系统,用于定义 视图 以及处理有歧义的 视图更新。最初,PostgreSQL 的规则系统由两种实现组成:
第一种实现使用 元组级 处理,并且深度实现于 执行器 内部。每当访问到单独一个元组时,规则系统就会被调用。这种实现在 1995 年被移除,当时 PostgreSQL 项目的最后一个官方发行版被转换成了 Postgres95。
规则系统的第二种实现是一种称为 查询重写 的技术。重写系统 是位于 解析器阶段 和 规划器/优化器 之间的一个模块。这种技术至今仍在使用。
有关 PostgreSQL 系统中规则的语法和创建的信息,请参阅 The PostgreSQL User's Guide(PostgreSQL 用户指南)。
查询重写系统 是位于解析器阶段和规划器/优化器之间的一个模块。它处理解析器阶段返回的树(表示一个用户查询),如果存在必须应用于该查询的规则,就把这棵树重写为另一种形式。
下面我们将概述查询重写系统的算法。为了便于说明,我们以如何使用规则实现视图作为例子。
给定下面这条规则:
create rule view_rule
as on select
to test_view
do instead
select s.sname, p.pname
from supplier s, sells se, part p
where s.sno = se.sno and
p.pno = se.pno;
每当检测到对关系 test_view 的 select 时,上面给出的规则就会被触发。此时执行的将不是从 test_view 中选择元组,而是规则 动作部分中给出的 select 语句。
再给定下面这个针对 test_view 的用户查询:
select sname
from test_view
where sname <> 'Smith';
下面列出每当出现针对 test_view 的用户查询时,查询重写系统所执行的各个步骤。(下面的列表只是对算法的非正式描述,仅用于基本理解。详细描述请参阅 [ston89]。)
test_view 重写
取规则动作部分中给出的查询。
调整 targetlist,使其符合用户查询中给出的属性的数量和顺序。
把用户查询 where 子句中给出的限定条件,加到规则动作部分所给查询的限定条件上。
依照上面给出的规则定义,用户查询将被重写成下面的形式(注意,重写是在解析器阶段返回的用户查询内部表示上完成的,但派生出的新数据结构将表示下面这个查询):
select s.sname
from supplier s, sells se, part p
where s.sno = se.sno and
p.pno = se.pno and
s.sname <> 'Smith';
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。