41.1. 查询树

要了解规则系统的工作方式,有必要知道何时调用规则以及它的 Importing 和结果是什么。

规则系统位于解析器和计划器之间。它采用解析器的输出,一个查询树和用户定义的重写规则(它们也是带有一些额外信息的查询树),并创建零个或多个查询树作为结果。因此,其 Importing 和输出始终是解析器本身可以产生的东西,因此,它看到的任何内容基本上都可以表示为 SQL 语句。

现在什么是查询树?它是 SQL 语句的内部表示形式,其中,生成该语句的单个部分被分开存储。如果设置配置参数debug_print_parsedebug_print_rewrittendebug_print_plan,则这些查询树可以显示在服务器日志中。规则操作也作为查询树存储在系统目录pg_rewrite中。它们的格式与日志输出不同,但是它们包含的信息完全相同。

读取原始查询树需要一些经验。但是,由于查询树的 SQL 表示足以理解规则系统,因此本章将不会讲授如何读取它们。

在阅读本章中查询树的 SQL 表示形式时,有必要能够确定该语句在查询树结构中时分为哪些部分。查询树的组成部分是

每个范围表条目都标识一个表或视图,并告诉其在查询的其他部分中使用哪种名称。在查询树中,范围表条目是按数字而不是按名称引用的,因此,这里是否有重复的名称并不重要,就像在 SQL 语句中一样。合并规则范围表后,可能会发生这种情况。本章中的示例将不会遇到这种情况。

SELECT查询没有结果关系。 (SELECT INTO的特殊情况与CREATE TABLE后跟INSERT ... SELECT的情况基本相同,在此不再单独讨论.)

对于INSERTUPDATEDELETE命令,结果关系是要使更改生效的表(或视图!)。

DELETE命令不需要常规的目标列表,因为它们不会产生任何结果。相反,计划者将一个特殊的 CTID 条目添加到空目标列表中,以使执行者可以找到要删除的行。 (当结果关系是普通表时,添加 CTID.如果是视图,则由规则系统添加全行变量,如Section 41.2.4中所述。)

对于INSERT命令,目标列表描述了应该进入结果关系的新行。它由VALUES子句中的表达式或INSERT ... SELECTSELECT子句中的表达式组成。重写过程的第一步是为原始命令未分配但具有默认值的任何列添加目标列表条目。规划器将使用常量 null 表达式填充所有剩余的列(既没有给定值,也没有默认值)。

对于UPDATE命令,目标列表描述了应替换旧行的新行。在规则系统中,它仅包含命令SET column = expression部分中的表达式。计划者将通过插入将旧行中的值复制到新行中的表达式来处理丢失的列。就像DELETE一样,添加了 CTID 或整行变量,以便执行程序可以标识要更新的旧行。

目标列表中的每个条目都包含一个表达式,该表达式可以是常量值,指向范围表中关系之一列的变量,参数或由函数调用,常量,变量,运算符,等等

上一章 首页 下一章