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
一般的に、各プランノードにはコストが1つだけ表示されます。しかし、Scan
演算子がFilter
および/またはProject
演算子と結合されている場合、複数のコスト構造が表示されます。それぞれが、結合された演算子の個々の論理部分に対応します。たとえば、ScanFilterProject
演算子には、Scan
、Filter
、Project
の部分に対応する3つのコスト構造が、この順序で表示されます。
EXPLAIN ANALYZEでは、実際のランタイム統計に加えて、推定コストも表示されます。