更新时间:2025-05-29 GMT+08:00

关键字概述

表访问方式

  • Seq Scan

    全表顺序扫描。

  • Index Scan

    索引扫描,优化器决定使用两步的规划:最底层的规划节点访问一个索引,找出匹配索引条件的行的位置,然后上层规划节点真实地从表中抓取出那些行。独立地抓取数据行比顺序地读取它们的开销高很多,但是因为并非所有表的页面都被访问了,这么做实际上仍然比一次顺序扫描开销要少。使用两层规划的原因是,上层规划节点在读取索引标识出来的行位置之前,会先将它们按照物理位置排序,这样可以最小化独立抓取的开销。

    如果在WHERE里面使用的好几个字段上都有索引,那么优化器可能会使用索引的AND或OR的组合。但是这么做要求访问两个索引,因此与只使用一个索引,而把另外一个条件只当作过滤器相比,这个方法未必是更优。

    索引扫描可以分为以下几类,它们之间的差异在于索引的排序机制。

    • Bitmap Index Scan

      使用位图索引抓取数据页。

    • Index Scan using index_name

      使用简单索引搜索,该方式按照索引键的顺序在索引表中抓取数据。该方式最常用于在大数据量表中只抓取少量数据的情况,或者通过ORDER BY条件匹配索引顺序的查询,以减少排序时间。

    • Index-Only Scan

      当需要的所有信息都包含在索引中时,仅索引扫描便可获取所有数据,不需要引用表。

  • Bitmap Heap Scan

    从其他操作创建的位图中读取页面,过滤掉不符合条件的行。位图堆扫描可避免随机I/O,加快读取速度。

  • TID Scan

    通过TupleID扫描表。

  • Index Ctid Scan

    通过Ctid上的索引对表进行扫描。

  • CTE Scan

    CTE对子查询的操作进行评估并将查询结果临时存储,相当于一个临时表。CTE Scan算子对该临时表进行扫描。

  • Foreign Scan

    从远程数据源读取数据。

  • Function Scan

    获取函数返回的结果集,将它们作为从表中读取的行并返回。

  • Sample Scan

    查询并返回采样数据。

  • Subquery Scan

    读取子查询的结果。

  • Values Scan

    作为VALUES命令的一部分读取常量。

  • WorkTable Scan

    工作表扫描。在操作中间阶段读取,通常是使用WITH RECURSIVE声明的递归操作。

表连接方式

  • Nested Loop

    嵌套循环,适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。

  • (Sonic) Hash Join

    哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。

  • Merge Join

    归并连接,通常情况下执行性能差于哈希连接。如果源数据已经被排序过,在执行归并连接时,并不需要再排序,此时归并连接的性能优于哈希连接。

运算符

  • Sort

    对结果集进行排序。

  • Filter

    EXPLAIN输出显示WHERE子句当作一个"filter"条件附属于顺序扫描计划节点。这意味着规划节点为它扫描的每一行检查该条件,并且只输出符合条件的行。预计的输出行数降低了,因为有WHERE子句。不过,扫描仍将必须访问所有 10000 行,因此开销没有降低,实际上它还增加了一些(确切的说,通过10000 * cpu_operator_cost)以反映检查WHERE条件的额外CPU时间。

  • Limit

    LIMIT限定了执行结果的输出记录数。如果增加了LIMIT,那么不是所有的行都会被检索到。

  • Append

    合并子操作的结果。

  • Aggregate

    将查询行产生的结果进行组合。可以是GROUPBY、UNION、SELECT DISTINCT子句等函数的组合。

  • BitmapAnd

    位图的AND操作,通过该操作组成匹配更复杂条件的位图。

  • BitmapOr

    位图的OR操作,通过该操作组成匹配更复杂条件的位图。

  • Gather

    将并行线程的数据汇总。

  • Group

    对行进行分组,以进行GROUP BY操作。

  • GroupAggregate

    聚合GROUP BY操作的预排序行。

  • Hash

    对查询行进行散列操作,以供父查询使用。通常用于执行JOIN操作。

  • HashAggregate

    使用哈希表聚合GROUP BY的结果行。

  • Merge Append

    以保留排序顺序的方式对子查询结果进行组合,可用于组合表分区中已排序的行。

  • ProjectSet

    对返回的结果集执行函数。

  • Recursive Union

    对递归函数的所有步骤进行并集操作。

  • SetOp

    集合运算,如INTERSECT或EXCEPT。

  • Unique

    从有序的结果集中删除重复项。

  • HashSetOp

    一种用于 INTERSECT 或 EXCEPT 等集合操作的策略,它使用 Append 来避免预排序的输入。

  • LockRows

    锁定有问题的行以阻止其他查询写入,但允许读。

  • Materialize

    将子查询的结果存储在内存里,以方便父查询快速访问获取。

  • Result

    在不进行扫描的情况下返回一个值。

  • WindowAgg

    窗口聚合函数,一般由OVER语句触发。

  • Merge

    归并操作。

  • StartWith Operator

    层次查询算子,用于执行递归查询操作。

  • Rownum

    对查询结果的行编号进行条件过滤。通常出现在rownum子句里。

  • Index Cond

    索引扫描条件。

  • Unpivot

    转置算子。

分区剪枝相关信息

  • Partition Iterator

    分区迭代器,通常代表子查询是对分区的操作。

  • Iterations

    分区迭代算子对一级分区的迭代次数。如果显示PART则为动态剪枝场景。

    例如:Iterations: 4表示迭代算子需要遍历4个一级分区。Iterations: PART表示遍历一级分区个数需要由分区键上的参数条件决定。

  • Selected Partitions

    一级分区剪枝的结果,m..n表示m到n号分区被剪枝选中,多个不连续的分区由逗号连接。

    例如:Selected Partitions: 2..4,7 表示2、3、4、7四个分区被选中。

  • Sub Iterations

    分区迭代算子对二级分区的迭代次数。如果显示PART则为动态剪枝场景。

    例如:Sub Iterations: 4表示迭代算子需要遍历4个二级分区。Iterations: PART表示遍历二级分区个数需要由分区键上的参数条件决定。

  • Selected Subpartitions

    二级分区被剪枝的结果,由一级分区序号:二级分区序号的格式展示。

    例如:Selected Subpartitions: 2:1 3:2 表示第二个一级分区的1号二级分区和第三个一级分区的2号二级分区被选中。Selected Subpartitions: ALL表示所有二级分区均被选中。

分布式关键字

  • Data Node Scan

    表示计划生成和执行在DN上进行。

  • Node/s: All datanodes

    表示计划下发到了哪些节点、

  • Remote query

    表示下发的SQL。

  • Streaming

    表示Streaming相关的算子,包含Gather,Redistribute,Broadcast。

其他关键字

  • InitPlan

    非相关子计划。

  • SubPlan

    相关子计划、