2.4. Postgres 规则系统

Postgres 有一个强大的 规则系统,用以阐述 视图和不明确的视图更新。 最初的 Postgres 规则系统由两个实现组成:

要获取关于 Postgres 系统里规则的创建和语法的信息,请参考 PostgreSQL 用户手册

2.4.1. 重写系统

重写系统 是一个位于分析器阶段和规划器/优化器之间的模块。 它处理分析器阶段传回的分析树(该分析树代表用户查询), 如果存在一条必须应用的规则的话, 这个模块把分析树重写成一个变化过的形式。

2.4.1.1. 实现视图的技巧

现在我们勾画一下查询重写系统的算法。 为了更好的说明问题,我们把用规则系统实现视图作为一个例子。

先给出下面规则:

  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 重写

  1. 获取在规则的动作部分给出的查询。

  2. 调整其目标列表以便与用户查询给出的字段的数目和顺序相匹配。

  3. 把用户查询的 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';