41.1. 查询树

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

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

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

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

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

  • 命令类型

    • 这是一个简单的值,告诉哪个命令(SELECTINSERTUPDATEDELETE)产生了查询树。
  • 范围表

    • 范围表是查询中使用的关系的列表。在SELECT语句中,这些是在FROM关键字后给出的关系。

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

  • 结果关系

    • 这是范围表中的索引,用于标识查询结果所处的关系。

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

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

  • 目标清单

    • 目标列表是定义查询结果的表达式列表。对于SELECT,这些表达式是构建查询最终输出的表达式。它们对应于关键字SELECTFROM之间的表达式。 (*只是关系的所有列名称的缩写.解析器将其扩展为各个列,因此规则系统从不会看到它.)

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

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

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

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

  • the qualification

    • 查询的限定条件很像是目标列表条目中包含的条件之一。该表达式的结果值是一个布尔值,该布尔值指示是否应执行最终结果行的操作(INSERTUPDATEDELETESELECT)。它对应于 SQL 语句的WHERE子句。
  • 联接树

    • 查询的连接树显示了FROM子句的结构。对于像SELECT ... FROM a, b, c这样的简单查询,联接树只是FROM项的列表,因为允许我们以任何 Sequences 联接它们。但是,当使用JOIN表达式,尤其是外部联接时,我们必须按照联接所示的 Sequences 进行联接。在这种情况下,连接树显示JOIN表达式的结构。与特定JOIN子句相关联的限制(来自ONUSING表达式)被存储为附加到那些联接树节点的限定表达式。事实证明,将顶级WHERE表达式存储为附加到顶级连接树项的限定条件也很方便。因此,联接树确实代表SELECTFROMWHERE子句。
  • the others

    • 查询树的其他部分(例如ORDER BY子句)在这里不重要。规则系统在应用规则时会在其中替换一些条目,但这与规则系统的基础没有太大关系。