详解

    以如下SQL语句为例:

    执行EXPLAIN的输出为:

    执行计划层级解读(纵向):

    1. 第一层:Seq Scan on t2

      表扫描算子,用Seq Scan的方式扫描表t2。这一层的作用是把表t2的数据从buffer或者磁盘上读上来输送给上层节点参与计算。

    2. 第二层:Hash

      Hash算子,作用是把下层计算输送上来的算子计算hash值,为后续hash join操作做数据准备

    3. 第三层:Seq Scan on t1

      表扫描算子,用Seq Scan的方式扫描表t1。这一层的作用是把表t1的数据从buffer或者磁盘上读上来输送给上层节点参与hash join计算。

    4. 第四层:Hash Join

      join算子,主要作用是将t1表和t2表的数据通过hash join的方式连接,并输出结果数据

    执行计划中的关键字说明:

    1. 表连接方式

      • Nested Loop

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

      • Merge Join

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

    2. 运算符

      • sort

        对结果集进行排序。

      • filter

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

      • LIMIT

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

    执行信息

    以如下SQL语句为例:

    执行EXPLAIN PERFORMANCE输出为:

    详解 - 图2