↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 7.0 / 6.5 / 6.4 / 6.3
历史版本。 PostgreSQL 6.5 已结束支持。 请参阅 当前版本手册.

51.4. Postgres 规则系统

Postgres 提供了一个强大的规则系统,用于定义视图以及处理有歧义的视图更新。最初,Postgres 的规则系统由两种实现组成:

  • 第一种实现使用元组级处理,并且深度实现于执行器内部。每当访问到单独一个元组时,规则系统就会被调用。这种实现在 1995 年被移除,当时 Postgres 项目的最后一个官方发行版被转换成了 Postgres95。

  • 规则系统的第二种实现是一种称为查询重写的技术。重写系统是位于解析器阶段和规划器/优化器之间的一个模块。这种技术至今仍在使用。

有关 Postgres 系统中规则的语法和创建的信息,请参阅 The PostgreSQL User's Guide(PostgreSQL 用户指南)。

51.4.1. 重写系统

查询重写系统是位于解析器阶段和规划器/优化器之间的一个模块。它处理解析器阶段返回的树(表示一个用户查询),如果存在必须应用于该查询的规则,就把这棵树重写为另一种形式。

51.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 中选择元组,而是规则动作部分中给出的 select 语句。

再给定下面这个针对 test_view 的用户查询:

  select sname 
  from test_view
  where sname <> 'Smith';
      

下面列出每当出现针对 test_view 的用户查询时,查询重写系统所执行的各个步骤。(下面的列表只是对算法的非正式描述,仅用于基本理解。详细描述请参阅 Stonebraker et al, 1989。)

test_view 重写

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

  2. 调整 targetlist,使其符合用户查询中给出的属性的数量和顺序。

  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';
      

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.