PostgreSQL

日期:2024-06-18 20:54 | 人气:

规划器/优化器首先生成扫描查询中使用的每个单独关系(表)的计划。可能的计划由每个关系上的可用索引确定。总是有可能对关系执行顺序扫描,因此总是创建顺序扫描计划。假设在关系上定义了一个索引(例如 B 树索引),并且查询包含限制 。如果 恰好与 B 树索引的键匹配,并且 是索引的运算符类中列出的运算符之一,则会使用 B 树索引创建另一个计划来扫描关系。如果存在更多索引并且查询中的限制恰好与索引的键匹配,则将考虑进一步的计划。还会为具有可与查询的 子句(如果有)匹配的排序顺序或可能对合并连接有用的排序顺序(见下文)的索引生成索引扫描计划。

如果查询需要连接两个或多个关系,则在找到扫描单个关系的所有可行计划后,才会考虑连接关系的计划。三种可用的连接策略是:

  • 嵌套循环连接:对于左关系中找到的每一行,右关系都会扫描一次。该策略很容易实施,但可能非常耗时。(但是,如果可以使用索引扫描来扫描右关系,那么这可能是一个很好的策略。可以使用左关系当前行的值作为右关系索引扫描的键。)

  • 合并连接:在连接开始之前,每个关系都根据连接属性进行排序。然后并行扫描这两个关系,并将匹配的行组合起来形成连接行。这种连接很有吸引力,因为每个关系只需扫描一次。所需的排序可以通过显式排序步骤或通过使用连接键上的索引以正确的顺序扫描关系来实现。

  • 散列连接:首先扫描正确的关系并将其加载到散列表中,使用其连接属性作为散列键。接下来扫描左关系,并将找到的每一行的适当值用作散列键来定位表中的匹配行。

当查询涉及两个以上关系时,最终结果必须由连接步骤树构建,每个连接步骤有两个输入。规划器检查不同可能的连接序列以找到最便宜的一个。

如果查询使用的关系少于 geqo_threshold ,则会进行近乎穷举的搜索来查找最佳连接序列。规划器优先考虑在 限定中存在相应连接子句(即,存在类似 的限制)的任何两个关系之间的连接。仅当没有其他选择时,即特定关系没有任何其他关系可用的连接子句时,才会考虑不带连接子句的连接对。为规划器考虑的每个连接对生成所有可能的计划,并选择(估计)最便宜的一个。

当超过 时,所考虑的连接序列由启发式确定,如 Chapter 62 中所述。否则过程是相同的。

完成的计划树由基本关系的顺序或索引扫描组成,加上所需的嵌套循环、合并或散列连接节点,以及所需的任何辅助步骤,例如排序节点或聚合函数计算节点。这些计划节点类型中的大多数都具有执行选择(丢弃不满足指定 Boolean 条件的行)和投影(基于给定列值计算派生列集,即在需要时评估标量表达式)的附加功能。规划器的职责之一是将 子句中的选择条件和所需输出表达式的计算附加到规划树的最合适的节点。

旋转小火锅定制流程

免费咨询

提供图纸

免费设计

免费报价

无忧安装

终身维护

平台注册入口