MaxCompute SQL の Explain 操作では、DML文に対応する最終実行計画の構造についての説明が表示されます。 実行計画は、SQL セマンティクスを実行する際の最終ステージで使用されるプログラムです。

関数の定義
EXPLAIN <DML query>;
'explain' を実行すると、次の情報が表示されます。
  • 指定した DML 文に対応する全タスクの依存構造
  • タスク内のすべてのタスク依存構造
  • タスク内のすべての演算子依存構造
例:
EXPLAIN
SELECT abs(a.key), b.value FROM src a JOIN src1 b ON a.value = b.value;
Explain の出力結果には、次の項目が含まれます。
  • ジョブ間の依存性: job0 is root job。このクエリでは 1 つのジョブ (job0) のみなので、1 行分の情報のみが必要です。
  • タスク間の依存性:
    In Job job0:
    root Tasks: M1_Stg1, M2_Stg1
    J3_1_2_Stg1 depends on: M1_Stg1, M2_Stg1

    Job0 は 3 つのタスクから構成されます。M1_Stg1 と M2_Stg1 が最初に実行され、次に J3_1_2_Stg1 が実行されます。

    タスクの命名規則は、次のとおりです。
    • MaxCompute には、MapTask、ReduceTask、JoinTask、LocalWork の 4 種類のタスクがあります。
    • タスク名の最初の文字は、タスクの種類を示します。 たとえば、M2Stg1 は、MapTask を示します。
    • 最初の文字に続く数字は、タスク ID を示します。タスク ID は現行のクエリに対応するすべてのタスクの中で一意でなければいけません。
    • アンダースコア (_) で区切られた数字は、現行タスクとの直接の依存性を示します。 たとえば、J3_1_2_Stg1 は、現行タスク (タスク ID : 3) が 2 つのタスク (タスク ID: 1 と 2) に依存していることを示します。

  • 3 つめの部分は、タスク内の演算子構造です。 演算子の文字列により、タスクの実行セマンティクスを示します。
    In Task M1_Stg1:
      Data source: yudi_2.src # Data source は、このタスクの入力コンテンツを示します
      TS: alias: a # TableScanOperator
          RS: order: + # ReduceSinkOperator
              keys:
                   a.value
              values:
                   a.key
              partitions:
                   a.value
    In Task J3_1_2_Stg1:
      JOIN: a INNER JOIN b # JoinOperator
          SEL: Abs(UDFToDouble(a._col0)), b._col5 # SelectOperator
              FS: output: None # FileSinkOperator
    In Task M2_Stg1:
      Data source: yudi_2.src1
      TS: alias: b
          RS: order: +
              keys:
                   b.value
              values:
                   b.value
              partitions:
                   b.value
    • 演算子の説明:
      • TableScanOperator: クエリ文中の FROM 文ブロックの論理式を示します。 EXPLAIN の結果には、入力テーブル名 (エイリアス) が表示されます。
      • SelectOperator: クエリ文中の SELECT 文ブロックの論理式を示します。 Explain の結果には、次の演算子に渡される列が、カンマ (,) で区切って表示されます。
        • 列の参照が渡される場合、< alias >.< column_name > と表示されます。
        • 式の結果が渡される場合、func1(arg1_1, arg1_2, func2(arg2_1, arg2_2)) のように、関数として表示されます。
        • 定数が渡される場合、その値が直接表示されます。
      • FilterOperator: クエリ文中の WHERE 文ブロックの論理式を示します。 SelectOperator の場合と同様に、Explain の結果には、WHERE 条件式が表示されます。
      • JoinOperator: クエリ文中の JOIN 文ブロックの論理式を示します。 Explain の結果には、結合されるテーブルと JOIN メソッドの両方が表示されます。
      • GroupByOperator: 集計演算の論理式を示します。 クエリ文中に集計関数を使用すると、その構造が表示されます。 Explain の結果には、集計関数の内容が表示されます。
      • ReduceSinkOperator: タスク間のデータ分散の論理式を示します。 現在のタスクの結果を別のタスクに渡す場合、現在のタスクの最後に ReduceSinkOperator を使用して、データ分散を実行する必要があります。 出力結果のソート方法、分散キー、ハッシュ値の計算に使用された値と列が、Explain の結果に表示されます。
      • FileSinkOperator: 最終データの保存操作を示します。 クエリ文中に Insert 文ブロックがある場合、挿入先のテーブル名が Explain の結果に表示されます。
      • LimitOperator: クエリ文中の LIMIT 文ブロックの論理式を示します。 Explain の結果には、制限数が表示されます。
      • MapjoinOperator: JoinOperator の場合と同様に、ターゲットテーブルの JOIN 操作を示します。
非常に複雑なクエリ文の場合、Explain の出力結果が多くなりすぎ、API 制限がトリガーされるため、Explain の結果がすべて表示されません。 このような場合には、クエリを分割して、部分ごとに Explain 操作を実行すると、ジョブ構造を把握することができます。