Lindormでは、データベース内のSQLステートメントの実行プロセスを表示できます。これにより、SQL実行の問題を特定してトラブルシューティングできます。EXPLAIN 構文を使用して、さまざまな深さでSQLステートメントのクエリプランを表示できます。プランに基づいてクエリロジックを分析および最適化し、クエリのパフォーマンスを向上させることができます。
適用可能なエンジン
クエリプランは、LindormTableとLindormTSDBに適用できます。
背景情報
クエリプランは、データベース内のSQLクエリステートメントの実行プロセスを表します。クエリプランは、実行プランとも呼ばれます。クエリのパフォーマンスを診断する場合、最初にクエリステートメントのクエリプランを表示して、クエリがステップごとに正常に実行されているかどうかを確認できます。したがって、SQLステートメントを最適化する前に、クエリプランを理解する必要があります。この目標を達成するには、まず、EXPLAIN構文で表示できるクエリプランで使用される演算子を理解する必要があります。
クエリプランの深さ
EXPLAIN 構文を使用して、次の3つの深さでクエリステートメントに対して生成されるクエリプランを表示できます。
論理プラン、物理プラン、および型プラン。
論理プラン
クエリの論理プランは、オプティマイザーによって最適化されていません。
Lindorm SQLは、抽象構文木に基づいてクエリを書き換えることで、クエリの論理プランを生成します。クエリのいくつかの論理演算は、最適化と実行を容易にするためにクエリプランで書き換えられます。たとえば、Lindorm SQLは、クエリ内の定数式をクエリプラン内の計算された定数に置き換えたり、クエリ内のAVG関数をクエリプラン内のSUMまたはCOUNT関数に置き換えたりすることがあります。EXPLAIN 構文でWITHOUT IMPLEMENTATION式を指定して、クエリの論理プランを表示できます。EXPLAN構文の詳細については、「EXPLAIN」をご参照ください。
次のステートメントを例として使用します。
SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;上記のステートメントのクエリプランを表示します。
EXPLAIN WITHOUT IMPLEMENTATION FOR SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: LogicalSort(sort0=[$0], dir0=[ASC])
LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1)])
LogicalProject(lp=[LOCATE('9378', $0)], c1=[$1])
LogicalFilter(condition=[LIKE($0, '3_%')])
LindormTableScan(table=[[db, test]])物理プラン
クエリの物理プランは、オプティマイザーによって最適化されます。Lindorm SQLのオプティマイザーは、特定のルールポリシーまたはコストポリシーに基づいて、論理プランの最適な実行モードを選択します。選択された実行モードとその候補は、物理プランと呼ばれます。
EXPLAIN 構文を使用してクエリのクエリプランを表示すると、デフォルトでクエリの物理プランが返されます。物理プランには、Lindorm SQLによって実行される演算子と、LindormTableによって実行される演算子が含まれています。
クエリの物理プランは、データスキャンモードやリレーショナル操作のシーケンスなど、SQLステートメントの実行プロセスを明確に示すことができます。
次のステートメントを例として使用します。
SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;上記のステートメントの物理プランを表示します。
EXPLAIN SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: EnumerableSort(sort0=[$0], dir0=[ASC])
EnumerableAggregate(group=[{0}], EXPR$1=[COUNT($1)])
EnumerableCalc(expr#0..3=[{inputs}], expr#4=['9378'], expr#5=[LOCATE($t4, $t0)], lp=[$t5], c1=[$t1])
EnumerableLindormDirectQuery(
explanation=[SELECT p1,c1,c2,c3 from test where ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%)) supportEmptyResult true
Candidate tables:
Data table: test, scores=1..0..1, need query back=false, sort type=FORWARD
Chose data table [test].
---
SELECT p1,c1,c2,c3 from test supportEmptyResult true
SingleScan on test
ranges: [3\x00, 4\x00]
filter: ((p1 < 4) AND (p1 >= 3) AND (p1 LIKE 3_%))
])型プラン
クエリの型プランには、クエリの結果セットの各列の型のみが含まれています。
型プランはクエリ型に基づいて生成され、特定のシナリオで使用されます。論理プランと物理プランと比較して、型プランには最小限の情報が含まれています。EXPLAIN 構文でWITH TYPE式を指定して、クエリの型プランを表示できます。EXPLAN構文の詳細については、「EXPLAIN」をご参照ください。
次のステートメントを例として使用します。
SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;上記のステートメントの型プランを表示します。
EXPLAIN WITH TYPE FOR SELECT LOCATE('9378', p1) AS lp, COUNT(c1) FROM (SELECT * FROM test WHERE p1 like '3_%') GROUP BY lp ORDER BY lp;
********************* 1. row *********************
PLAN: lp INTEGER NOT NULL,
EXPR$1 BIGINT NOT NULLクエリプランの演算子
このセクションでは、クエリプランに含まれる一般的な演算子について説明します。
汎用物理演算子
Lindorm SQLは、オプティマイザーが物理プランを生成するための一連の汎用物理演算子を提供します。これらの演算子は、クエリでのソート、集計、射影、計算などの汎用計算操作を実行するために使用できます。次の汎用物理演算子は、クエリでよく使用されます。
EnumerableLimit
この演算子は、指定されたOFFSET値とLIMIT値に基づいて、結果セットデータをスキップおよび切り捨てるために使用されます。この演算子に必要な
offset値とfetch値のソースは、返されたクエリプランに表示されます。EnumerableSort
この演算子は、クエリで指定されたORDER BY句に基づいてデータをソートするために使用されます。デフォルトのソートアルゴリズムは、ツリーマッピングに基づいて実装されます。この演算子で使用されるソートキーのソースは、返されたクエリプランに表示されます。
EnumerableAggregate
この演算子は、指定された集計関数と可能なグループ化列に基づいて、下位レベルの演算子によって反復的に返されるデータを集計するために使用されます。この演算子は、DISTINCT構文を実装するためにも使用できます。演算子のグループ化キーと集計関数に関連する式は、返されたクエリプランに表示されます。
EnumerableCalc
この演算子は、算術式や集計関数とウィンドウ関数を除く関数の式など、一般的な式の値を計算するために使用できます。さらに、射影やフィルタリングなどの計算操作も、この演算子を使用して実装されます。
拡張物理演算子
EnumerableLindormDirectQuery
EnumerableLindormDirectQuery演算子は、Lindorm SQLによって提供される汎用拡張演算子であり、計算のためにストレージエンジンにプッシュダウンされるクエリの部分を示します。この演算子の返された結果は、explanation フィールドに含まれています。 explanationフィールドに含まれる情報は、Lindormエンジンによって異なります。
エンジン | explanationフィールドに含まれる情報 |
LindormTable | LindormTableで実行される計算操作。次の情報が含まれます。
|
LindormTSDB | 呼び出されたLindormTSDB APIのパラメーター。 |
LindormTSDBの拡張演算子
TSDBDataScanRel
この演算子は、論理演算子LogicalTableScanのバリアントであり、特定のメトリックに対するスキャン操作を実行するために使用されます。演算子の次のフィールドは、返されたクエリプランに表示されます。
filter:スキャン操作のフィルター条件。
project:上位レベルのクエリプランの演算子式と時系列テーブル間のマッピング。
hint:スキャン操作と一緒にプッシュダウンされるヒント(
_l_series_onlyなど)。
TSDBShowTagRel
この演算子は、タグ列のすべてのタグ値に対して実行されるクエリを最適化するために使用されます。この演算子は、InfluxDBの
SHOW TAG VALUES構文と同じ機能を提供します。この演算子は通常、クエリプランツリーの最下位レベルにあり、TSDBDataScanRel演算子に似ています。この演算子は、データエンジンでのデータスキャン方法を示すために使用されます。SELECT DISTINCT ${tagkey column} FROM ${table}形式のクエリのみを、この演算子を使用して最適化できます。TSDBAggScanRel
この演算子は、EnumerableAggregation演算子とTSDBDataScanRel演算子の組み合わせであり、時系列を集計するために使用されます。
EnumerableDownsampleQuery
この演算子は、Lindorm SQLによって提供される
SAMPLE BY構文に固有です。SAMPLE BY構文は、ダウンサンプリングシナリオでのLindormTSDBの拡張SQL方言です。構文のすべてのコンテキストが拡張されます。これには、論理演算子LogicalDownsampleQueryと物理演算子EnumerableDownsampleQueryが含まれます。したがって、EnumerableDownsampleQuery演算子は、SAMPLE BY構文を使用するクエリのクエリプランにのみ含まれます。演算子の次のフィールドは、返されたクエリプランに表示されます。
project:上位レベルのクエリプランの演算子式とEnumerableDownsampleQuery演算子間のマッピング。
filter:ダウンサンプリング操作と一緒にLindormTSDBにプッシュダウンされるフィルター条件。
ds_agg:クエリで使用されるダウンサンプリング関数と関数のパラメーター。
aggregator:集計操作と一緒にLindormTSDBにプッシュダウンされる集計演算子。
hint:LindormTSDBにプッシュダウンされるヒント。