9.1第三十七章

From PostgreSQL wiki
Jump to navigationJump to search

第37章. 规则系统(The Rule System)

本章讨论PostgreSQL的规则系统(rule system)。产生式规则系统(production rule system)的概念很简单,但是在实际使用它们的时候会遇到很多微妙的问题。

其它很多数据库系统定义了主动数据库规则(active database rule),这些规则通常是一些存储过程(stored procedure)以及触发器(trigger)。在PostgreSQL中,同样可以使用函数(function)和触发器来实现它们。

但是,规则系统(更准确的说,查询重写规则系统query rewrite rule system)是和存储过程以及触发器完全不同的东西。它考虑规则并修改查询语句,然后将修改后的查询传递给查询计划器(query planner)来生成查询计划并且执行。PostgreSQL的规则系统非常的强大,可以用在很多地方,比如说查询语言过程(procedure),视图(view),版本(version)等。规则系统的理论基础和强大之处在以下两篇文章中有介绍:[On Rules, Procedures, Caching and Views in Database Systems] 和[A Unified Framework for Version Modeling Using Production Rules in a Database System]。

37.1. 查询树(Query Tree)

要理解规则系统如何工作,我们需要知道它什么时候会被触发,以及它的输入和输出的结果分别是什么。

规则系统位于语法分析器(parser)和查询计划器(planner)之间。规则系统的输入是分析器的输出和用户定义的重写规则,而它的输出结果是它以此创建的查询树(零个或多个)。其中分析器的输出是一棵查询树,用户自定义的重写规则也是查询树,只不过多了一些额外的信息。因此,规则系统的输入和输出仍然是分析器自己可以产生的东西,也就是说,查询树。因而,任何规则系统可以看到的东西在本质上都可以用SQL语句来表示。

那么,什么是查询树(query tree)呢?它是SQL语句的内部表示,它把SQL语句的每一部分都单独存储。如果你设置了服务器的这几个参数(debug_print_parse, debug_print_rewritten, debug_print_plan),你可以在服务器日志中看到这些查询树。规则动作(action)也以查询树的形式存储在系统表pg_rewrite中。虽然它们不是日志输出那样的格式,但是它们包含的信息是完全一样的。

需要有相关的经验才能读懂查询树。但是,因为读懂了查询树所代表的SQL语句就能理解规则系统,所以本章并不介绍如何读懂查询树。

在本章中,当阅读查询树的SQL表示时,需要能够识别出语句中和查询树结构的各部分相对应的部分。一棵查询树包含下面几部分: