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 中。