メインコンテンツまでスキップ
バージョン: 4.x

説明

概要

EXPLAIN文は、与えられたクエリに対するDorisのクエリ実行計画を表示します。Dorisのクエリオプティマイザーは、統計データ、データ特性、およびHASH JOIN、パーティショニング、バケッティングなどの機能を使用して効率的な計画を作成することを目的としています。しかし、理論的および実用的な制約により、計画が期待通りに動作しない場合があります。

パフォーマンスを向上させるには、現在の計画を分析することが不可欠です。この記事では、最適化のためのEXPLAIN文の使用方法を説明します。

構文

{EXPLAIN | DESC} [VERBOSE] <query_block>

必須パラメータ

<query_block>

これは実行プランを取得したいクエリ文です。

オプションパラメータ

[VERBOSE]

詳細情報を表示するかどうかはVERBOSEの指定により決まります。VERBOSEを指定すると、各オペレータの詳細、使用するタプルID、各タプルの詳細な説明を含む包括的な詳細が表示されます。指定しない場合は、簡潔な情報が提供されます。

戻り値

基本概念

EXPLAINで表示される情報をより理解するために、Doris実行プランの基本概念をいくつか紹介します。

名前説明
PLAN実行プラン。クエリは実行プランナーによって実行プランに変換され、実行エンジンによって実行されます。
FRAGMENT実行フラグメント。Dorisはバックエンドエンジンであるため、完全な実行プランは複数の単一ノード実行フラグメントに分割されます。FRAGMENTテーブルは完全な単一ノード実行フラグメントを表します。複数のFRAGMENTが組み合わさって完全なPLANを形成します。
PLAN NODEオペレータ。実行プランの最小単位。FRAGMENTは複数のオペレータで構成されます。各オペレータは集約、結合など特定の実行ロジックを担当します。

戻り値の構造

Doris EXPLAIN文の結果は完全なPLANです。PLAN内では、FRAGMENTは実行順序に基づいて後ろから前に順序付けられます。各FRAGMENT内では、オペレータ(PLAN NODE)も実行順序に基づいて後ろから前に順序付けられます。

以下に例を示します:

+--------------------------------------------------+
| Explain String(Nereids Planner) |
+--------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS: |
| cnt[#10] |
| cnt[#11] |
| PARTITION: UNPARTITIONED |
| |
| HAS_COLO_PLAN_NODE: false |
| |
| VRESULT SINK |
| MYSQL_PROTOCAL |
| |
| 7:VEXCHANGE |
| offset: 0 |
| distribute expr lists: |
| |
| PLAN FRAGMENT 1 |
| |
| PARTITION: RANDOM |
| |
| HAS_COLO_PLAN_NODE: false |
| |
| STREAM DATA SINK |
| EXCHANGE ID: 07 |
| UNPARTITIONED |
| |
| 6:VHASH JOIN(354) |
| | join op: INNER JOIN(BROADCAST)[] |
| | equal join conjunct: cnt[#7] = cnt[#5] |
| | cardinality=1 |
| | vec output tuple id: 8 |
| | vIntermediate tuple ids: 7 |
| | hash output slot ids: 5 7 |
| | distribute expr lists: |
| | distribute expr lists: |
| | |
| |----4:VEXCHANGE |
| | offset: 0 |
| | distribute expr lists: |
| | |
| 5:VEXCHANGE |
| offset: 0 |
| distribute expr lists: |
| |
| PLAN FRAGMENT 2 |
| ... |
| |
| PLAN FRAGMENT 3 |
| ... |
+--------------------------------------------------+

オペレーターは破線で子ノードとリンクされています。オペレーターに複数の子がある場合、それらは垂直に配置され、右から左の順序を表します。上記の例では、オペレーター6(VHASH JOIN)は、オペレーター5(EXCHANGE)を左の子として、オペレーター4(EXCHANGE)を右の子として持ちます。

Fragmentフィールドの説明

NameDescription
PARTITION現在のFragmentのデータ分散を表示します
HAS_COLO_PLAN_NODEfragmentにcolocateオペレーターが含まれているかどうかを示します
Sinkfragmentデータ出力の方法、詳細は下記の表を参照してください

Sinkメソッド

NameDescription
STREAM DATA SINK次のFragmentにデータを出力します。2行の情報が含まれます。
1行目:データが送信される下流のEXCHANGE NODE。
2行目:データ分散の方法。
- UNPARTITIONEDは、各下流インスタンスが完全なデータセットを受信することを意味します。これは通常、ブロードキャスト結合や、グローバルlimitやorder byなどの単一インスタンスロジックが必要な場合に発生します。
- RANDOMは、各下流インスタンスが重複なしでランダムなデータサブセットを受信することを意味します。
- HASH_PARTITIONEDは、リストされたslotをキーとして使用してハッシュ化し、データシャードを同じ下流インスタンスに送信します。これは、パーティションハッシュ結合の上流や2段階集約の第2段階でよく使用されます。
RESULT SINK結果データをFEに送信します。1行目はデータ転送に使用されるプロトコルを示し、現在MySQLプロトコルとarrowプロトコルをサポートしています。
OLAP TABLE SINKOLAPテーブルにデータを書き込みます。
MultiCastDataSinks複数のSTREAM DATA SINKを含むマルチキャストオペレーターです。各STREAM DATA SINKは完全なデータセットを下流に送信します。

Tuple情報の説明

VERBOSEモードを使用すると、Tuple情報が出力されます。Tuple情報は、SLOTタイプ、nullable状態などを含む、データ行内のSLOTの詳細を説明します。

出力には複数のTupleDescriptorが含まれ、それぞれに複数のSlotDescriptorが含まれます。例を以下に示します:

Tuples:
TupleDescriptor{id=0, tbl=t1}
SlotDescriptor{id=0, col=c1, colUniqueId=0, type=int, nullable=true, isAutoIncrement=false, subColPath=null}
SlotDescriptor{id=2, col=c3, colUniqueId=2, type=int, nullable=true, isAutoIncrement=false, subColPath=null}

TupleDescriptor

NameDescription
idtuple descriptorのid
tbltupleに対応するテーブル、または該当しない場合はnull

SlotDescriptor

NameDescription
idslot descriptorのid
colslotに対応するカラム、または該当しない場合は空白
colUniqueId対応するカラムの一意のid、または該当しない場合は-1
typeslotのタイプ
nullable対応するデータがnullになりうるかを示す
isAutoIncrementカラムが自動インクリメントかどうかを示す
subColPathカラム内のサブカラムパス、現在はvariantタイプにのみ適用

オペレータの説明

オペレータリスト

NameDescription
AGGREGATE集約オペレータ
ANALYTICウィンドウ関数オペレータ
ASSERT NUMBER OF ROWS下流の出力行数をチェックするオペレータ
EXCHANGEデータ交換受信オペレータ
MERGING-EXCHANGEソートと行制限機能を持つデータ交換受信オペレータ
HASH JOINハッシュ結合オペレータ
NESTED LOOP JOINネストループ結合オペレータ
PartitionTopNパーティション内データ事前フィルタリングオペレータ
REPEAT_NODEデータ複製オペレータ
DataGenScanNodeテーブル値関数オペレータ
EsScanNodeESテーブルスキャンオペレータ
HIVE_SCAN_NODEHiveテーブルスキャンオペレータ
HUDI_SCAN_NODEHudiテーブルスキャンオペレータ
ICEBERG_SCAN_NODEIcebergテーブルスキャンオペレータ
PAIMON_SCAN_NODEPaimonテーブルスキャンオペレータ
JdbcScanNodeJdbcテーブルスキャンオペレータ
OlapScanNodeOlapテーブルスキャンオペレータ
SELECTフィルタリングオペレータ
UNION集合和オペレータ
EXCEPT集合差オペレータ
INTERSECT集合積オペレータ
SORTソートオペレータ
TOP-Nソートして上位N件を返すオペレータ
TABLE FUNCTION NODEテーブル関数オペレータ(lateral view)

共通フィールド

NameDescription
limit出力行数を制限
offset出力前にスキップする行数
conjuncts現在のノードの結果をフィルタリング。projectionより前に実行される
projections現在のオペレータ後のプロジェクション操作。conjunctsの後に実行される
project output tuple idプロジェクション後の出力tuple。データtuple内のslotの配置はtuple descで確認可能
cardinalityオプティマイザによる推定行数
distribute expr lists現在のノードの子ノードに対する元のデータ分散方法
Expression's slot idslot idに対応する具体的なslotはverboseモードのtupleリストで確認可能。このリストはslotタイプやnull許可属性などの情報を提供。式の後に[#5]として表示される

AGGREGATE

NameDescription
(Aggregation Phase)集約フェーズは2つの用語で表現される
最初の用語はupdate(ローカル集約)またはmerge(グローバル集約)
2番目の用語は現在のデータがシリアライズされているか(serialize)、最終計算が完了しているか(finalize)を示す
STREAMINGマルチステージ集約truncationのローカル集約オペレータのみにあるフラグ。現在の集約ノードがSTREAMINGモードを使用する可能性があることを示し、入力データが実際の計算を行わずに直接次のステージの集約に渡される
output現在の集約オペレータの出力。すべてのローカル事前集約関数にはpartialのプレフィックスが付く
group by集約のキー

ANALYTIC

NameDescription
functions現在のウィンドウ関数の名前
partition byウィンドウ関数のover句のpartition by句に対応。ウィンドウ式
order byウィンドウ内のソート式と順序
windowウィンドウ範囲

ASSERT NUMBER OF ROWS

NameDescription
EQ下流の出力はこの行数制約に一致する必要がある

HASH JOIN

NameDescription
join op結合のタイプ
equal join conjunct結合条件の等価条件
other join predicates結合条件のうち等価以外の条件
mark join predicatesmark joinで使用される条件
other predicates結合実行後のフィルタリング述語
runtime filters生成されたランタイムフィルタ
output slot ids最終出力slotのリスト
hash output slot idsハッシュ結合実行後、ただし他の結合条件が適用される前の出力slotのリスト
isMarkJoinmark joinかどうかを示す

NESTED LOOP JOIN

NameDescription
join op結合操作のタイプ
join conjuncts結合の条件
mark join predicatesmark joinで使用される条件
predicates結合後のフィルタ述語
runtime filters生成されたランタイムフィルタ
output slot ids最終出力slotのリスト
isMarkJoinmark joinかどうか

PartitionTopN

NameDescription
functionsグループ化フィルタ最適化を適用するウィンドウ関数
has global limitグローバルな行数制限の有無
partition limit各パーティション内の行数制限
partition topn phase現在のフェーズ:パーティションキーでshuffling後のグローバルフェーズの場合はTWO_PHASE_GLOBAL_PTOPN、パーティションキーでshuffling前のローカルフェーズの場合はTWO_PHASE_LOCAL_PTOPN

REPEAT_NODE

NameDescription
repeat各行の繰り返し回数と集約カラムに対応するslot id
exprs繰り返し後の出力データの式のリスト

DataGenScanNode

NameDescription
table value functionテーブル関数名

EsScanNode

NameDescription
SORT COLUMN結果のソート用カラム
LOCAL_PREDICATESDoris内で実行されるフィルタ
REMOTE_PREDICATESES内で実行されるフィルタ
ES index/typeクエリ対象のESインデックスとタイプ

HIVE_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約

HUDI_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
hudiNativeReadSplitsネイティブ方式で読み取られるスプリット数

ICEBERG_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
icebergPredicatePushdowniceberg APIにプッシュダウンされたフィルタ

PAIMON_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
paimonNativeReadSplitsネイティブ方式で読み取られるスプリット数

NESTED LOOP JOIN

NameDescription
join op結合操作のタイプ
join conjuncts結合の条件
mark join predicatesmark joinで使用される条件
predicates結合後のフィルタ述語
runtime filters生成されたランタイムフィルタ
output slot ids最終出力slotのリスト
isMarkJoinmark joinかどうか

PartitionTopN

NameDescription
functionsグループ化フィルタ最適化を適用するウィンドウ関数
has global limitグローバルな行数制限の有無
partition limit各パーティション内の行数制限
partition topn phase現在のフェーズ:パーティションキーでshuffling後のグローバルフェーズの場合はTWO_PHASE_GLOBAL_PTOPN、パーティションキーでshuffling前のローカルフェーズの場合はTWO_PHASE_LOCAL_PTOPN

REPEAT_NODE

NameDescription
repeat各行の繰り返し回数と集約カラムに対応するslot id
exprs繰り返し後の出力データの式のリスト

DataGenScanNode

NameDescription
table value functionテーブル関数名

EsScanNode

NameDescription
SORT COLUMN結果のソート用カラム
LOCAL_PREDICATESDoris内で実行されるフィルタ
REMOTE_PREDICATESES内で実行されるフィルタ
ES index/typeクエリ対象のESインデックスとタイプ

HIVE_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約

HUDI_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
hudiNativeReadSplitsネイティブ方式で読み取られるスプリット数

ICEBERG_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
icebergPredicatePushdowniceberg APIにプッシュダウンされたフィルタ

PAIMON_SCAN_NODE

NameDescription
inputSplitNumスキャンスプリット数
totalFileSizeスキャンされるファイルの総サイズ
scanRangesスキャンスプリットの情報
partitionスキャンされるパーティション数
backends各BEがスキャンする具体的なデータ情報
cardinalityオプティマイザによる推定行数
avgRowSizeオプティマイザによる推定平均行サイズ
numNodes現在のオペレータが使用するBE数
pushdown aggスキャンにプッシュダウンされた集約
paimonNativeReadSplitsネイティブ方式で読み取られるスプリット数

JdbcScanNode

NameDescription
TABLEスキャンするJDBC側のテーブル名
QUERYスキャンに使用するクエリ

OlapScanNode

NameDescription
TABLEスキャンされるテーブル。括弧内はヒットした同期マテリアライズドビューの名前を示す
SORT INFOSCANの事前ソートが計画されている場合に存在。SCANの出力の部分的な事前ソートと事前切り捨てを示す
SORT LIMITSCANの事前ソートが計画されている場合に存在。事前切り捨ての切り捨て長を示す
TOPN OPTTOP-N Runtime Filterが計画されている場合に存在
PREAGGREGATION事前集約が有効かどうかを示す。MOR集約とプライマリキーモデルに関連。ONは、ストレージ層のデータが上位層のニーズを満たしており追加の集約が不要であることを意味。OFFは追加の集約が実行されることを意味
partitions現在スキャンされているパーティション数、総パーティション数、およびスキャンされたパーティション名のリスト
tabletsスキャンされたタブレット数とテーブル内の総タブレット数
tabletListスキャンされたタブレットのリスト
avgRowSizeオプティマイザによる推定行サイズ
numNodes現在のスキャンに割り当てられたBE数
pushAggOpzonemapメタデータを読み取ることで結果が返される。MIN、MAX、COUNT集約情報をサポート

UNION

NameDescription
constant exprs出力に含められる定数式のリスト
child exprs子の出力がこの式リストでプロジェクションされて集合演算子への入力となる

EXCEPT

NameDescription
child exprs子の出力がこの式リストでプロジェクションされて集合演算子への入力となる

INTERSECT

NameDescription
child exprs子の出力がこの式リストでプロジェクションされて集合演算子への入力となる

SORT

NameDescription
order byソートキーと具体的なソート順序

TABLE FUNCTION NODE

NameDescription
table function使用されるテーブル関数の名前
lateral view tuple id新たに生成されたカラムに対応するtuple ID
output slot idカラムプルーニング後に出力されるカラムのslot IDのリスト

TOP-N

NameDescription
order byソートキーと具体的なソート順序
TOPN OPTTOP-Nランタイムフィルタ最適化がヒットした場合に存在
OPT TWO PHASETOP-N遅延マテリアライゼーションがヒットした場合に存在