↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

2.4. Postgres 规则系统 #

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

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

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

有关 Postgres 系统中规则的语法和创建的信息,请参阅 The PostgreSQL User's Guide(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 中选择元组,而是规则 动作部分中给出的 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';
      

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。