Postgres 规则系统

Postgres 维持一个强大的规则系统,用以阐述视图和不明确的视图更新。最初Postgres规则系统包含两个实现: 要获取关于 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';