Postgres 有一个强大的 规则系统,用以阐述 视图和不明确的视图更新。 最初的 Postgres 规则系统由两个实现组成:
第一个能用的规则系统采用元组级别的处理, 是在执行器的深层实现的。 每次访问一条独立的元组时都要调用规则系统。 这个实现在1995年被删除了,那时 Postgres 项目的最后一个官方版本正转换成 Postgres95。
第二个规则系统的实现从技术角度来说叫 查询重写。 重写系统是一个存在于 分析器阶段和 规划器/优化器之间的一个模块。这个技术实现仍然存在。
要获取关于 Postgres 系统里规则的创建和语法的信息,请参考 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 里选择元组。
给出下面的对 test_view 的用户查询:
select sname from test_view where sname <> 'Smith';
这里是当一个用户查询作用于 test_view 时, 查询重写系统执行的一系列步骤。(下面的列表只是一个非常不正 式的关于查询重写的算法的描述,只是用于了解基础。 更多的详细描述请参考 Stonebraker et al, 1989)。
test_view 重写
获取在规则的动作部分给出的查询。
调整其目标列表以便与用户查询给出的字段的数目和顺序相匹配。
把用户查询的 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';