EXPLAIN 中的成本

在规划过程中,与计划中每个节点相关的成本是根据查询中表的表统计信息计算得出的。此计算出的成本作为 EXPLAIN 语句的输出的一部分打印。

成本信息以格式 {rows: XX (XX), cpu: XX, memory: XX, network: XX} 显示在计划树中。 rows 指的是每个计划节点在执行期间输出的行数的预期值。括号中紧随行数的值指的是每个计划节点输出的数据的大小(以字节为单位)。其他参数表示每个计划节点执行所使用的 CPU、内存和网络的估计量。这些值不代表任何实际单位,而是用于比较计划节点之间相对成本的数字,从而允许优化器为执行查询选择最佳计划。如果任何值未知,则会打印 ?

例如

presto:default> EXPLAIN SELECT comment FROM tpch.sf1.nation WHERE nationkey > 3;

- Output[comment] => [[comment]]
        Estimates: {rows: 22 (1.69kB), cpu: 6148.25, memory: 0.00, network: 1734.25}
    - RemoteExchange[GATHER] => [[comment]]
            Estimates: {rows: 22 (1.69kB), cpu: 6148.25, memory: 0.00, network: 1734.25}
        - ScanFilterProject[table = tpch:nation:sf1.0, filterPredicate = ("nationkey" > BIGINT '3')] => [[comment]]
                Estimates: {rows: 25 (1.94kB), cpu: 2207.00, memory: 0.00, network: 0.00}/{rows: 22 (1.69kB), cpu: 4414.00, memory: 0.00, network: 0.00}/{rows: 22 (1.69kB), cpu: 6148.25, memory: 0.00, network: 0.00}
                nationkey := tpch:nationkey
                comment := tpch:comment

通常,每个计划节点只打印一个成本。但是,当 Scan 运算符与 Filter 和/或 Project 运算符组合使用时,会打印多个成本结构,每个结构对应于组合运算符的单个逻辑部分。例如,对于 ScanFilterProject 运算符,将打印三个成本结构,分别对应于运算符的 ScanFilterProject 部分,按照此顺序。

除了实际运行时统计信息之外,在 EXPLAIN ANALYZE 中也会打印估计成本。