Databricks SQLのクエリープロファイル

[Query profile \| Databricks on AWS](https://docs.databricks.com/sql/admin/query-profile.html) [2022/6/23時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

クエリー実行の詳細を可視化するためにクエリープロファイルを活用できます。クエリープロファイルを用いることで、以下のようにしてクエリー実行時のパフォーマンスのボトルネックをトラブルシュートすることができます。

- それぞれのクエリーや処理時間、処理行数、メモリー使用量のような関連メトリクスを可視化することができます。
- パッとみてクエリー実行で最も遅い箇所を特定し、クエリー変更のインパクトを評価することができます。
- 爆発的なjoinやフルテーブルスキャンのような、よくあるSQL文の間違いを発見し、修正することができます。

# 要件

クエリープロファイルを参照するには、クエリーのオーナーであるか、クエリーを実行するSQLウェアハウスの**Can Manage**[権限](https://docs.databricks.com/sql/user/security/access-control/sql-endpoint-acl.html)を持っている必要があります。

# クエリープロファイルの参照

クエリーのプロファイルを参照するには、

1. [クエリー履歴](https://docs.databricks.com/sql/admin/query-history.html#view-query-history)を参照します。
1. クエリー名をクリックします。
1. **View Query Profile**をクリックします。基本的なクエリーメトリクスの概要が表示されます。
![](https://docs.databricks.com/_images/query-profile.png)

    :::note info
    **注意**
    **クエリープロファイルが利用できません**と表示された場合、このクエリーではプロファイルが利用できません。クエリーキャッシュから実行されたクエリーではクエリープロファイルを利用することはできませ。クエリーキャッシュを回避するには、`LIMIT`を変更するか削除するなど、クエリーに些細な修正を行なってください。
   :::

1. ツリービュー(デフォルト)でクエリープロファイルを参照するには、**Tree view**をクリックします。グラフとしてクエリープロファイルを表示するには、**Graph view**をクリックします。

    - ツリービューは、最も時間を要しているオペレーターを特定するような、クエリーパフォーマンスに関する問題をクイックに特定するのに最適化されています。
    - グラフビューは、あるノードから別のノードにどのようにデータが流れているのかを可視化することに最適化されています。

1. ツリービューやグラフビューでは、それぞれのクエリータスクの詳細を参照するためにページ上部にあるタブをクリックすることができます。

    - **Time**: それぞれのオペレーションのすべてのタスクで消費された実行時間の合計です。
    - **Rows**: それぞれのクエリータスクで影響を受けた行の数とサイズです。
    - **Memory**: それぞれのクエリータスクで消費されたピークメモリーです。

    :::note info
    **注意**
いくつかの非Photonのオペレーションはグループとして実行され、共通メトリクスをシェアします。この場合、特定のメトリックにおいてすべてのサブタスクは親のタスクと同じ値を持ちます。
   :::

1. ツリービューでサブタスクが存在する場合、`>`をクリックして展開することができます。グラフビューでは、詳細を表示するためにノードをクリックします。
1. それぞれのタスクオペレーションが表示されます。デフォルトでは、いくつかのオペレーションのタスクとメトリクスは非表示となっています。これらのオペレーションはパフォーマンスのボトルネックになる可能性が低いものです。すべてのオペレーションの情報を表示し、追加のメトリクスを確認するには、ページ上部にある![](https://docs.databricks.com/_images/vertical-ellipsis.png)をクリックし、**Enable verbose mode**をクリックします。最も一般的なオペレーションを以下に示します。

    - **Scan**: データソースからデータが読み込まれ、業として出力されました。
    - **Join**: 複数のリレーションの行が一連の行セットに結合(つなぎ合わ)されました。
    - **Union**: 同じスキーマを用いた複数のリレーションの行が一連の行セットにまとめられました。
    - **Shuffle**: データは再分配、再パーティション化されました。シャッフルオペレーションは、クラスターのエグゼキューター間でデータを移動するので高価なオペレーションです
    - **Hash / Sort**: 行がグルーピングされ、各グループに対して`SUM`、`COUNT`、`MAX`のような集計関数を用いて評価が行われました。
    - **Filter**: `WHERE`句を用いるなどして、評価指標に基づいて入力がフィルタリングされ、行のサブセットが返却されました。
    - **(Reused) Exchange**: 希望されるパーティショニングに基づいて、クラスターノード間でデータを再分配するために、シャッフルあるいはブロードキャストエクスチェンジが使用されました。
    - **Collect Limit**: `LIMIT`文を用いて返却行が切り捨てられました。
    - **Take Ordered And Project**: クエリー結果のトップN行が返却されました。

1. Apache Spark UIでクエリープロファイルを表示するには、ページ上部にある![](https://docs.databricks.com/_images/vertical-ellipsis.png)をクリックし、**Open in Spark UI**をクリックします。
1. インポートしたクエリープロファイルを閉じるには、ページ上部の**X**をクリックします。

クエリープロファイルで利用できる情報の詳細に関しては、[クエリープロファイル詳細の参照](#クエリープロファイル詳細の参照)をご覧ください。

# クエリープロファイル詳細の参照

クエリープロファイルでは、最後のタスクが先頭に来るように逆順でトップレベルのクエリータスクが一覧されます。左側には、当該タスクのタスクシーケンス、オペレーション名、選択されたメトリックのグラフが表示されます。クエリープロファイルのさまざまなパーツに慣れるために以下の手順を踏んでください。

1. それぞれのサブタスクに期間を確認するために**Time**をクリックします。
1. クエリーによって返却された行の数とサイズを確認するために**Rows**をクリックします。
1. それぞれのクエリータスクで消費されたメモリーを確認するために**Memory**をクリックします。サブタスクがある場合には、**>**でそれぞれのサブタスクの詳細を確認できます。
1. 右側で、クエリーのSQL文、ステータス、開始・終了時刻、期間、クエリー実行ユーザー、クエリー実行に用いられたウェアハウスを確認するために**Overview**をクリックします。
1. タスクの説明文、タスク期間、消費メモリー、返却業の数とサイズのようなメトリクス、リネージュ(依存関係)といったタスクの詳細を確認するためにタスクをクリックします。
1. サブタスクの詳細を閉じるには、**X**をクリックします。
1. ウェアハウスのプロパティを参照するにはSQLウェアハウス名をクリックします。
1. Apache Spark UIでクエリープロファイルを表示するには、ページ上部にある![](https://docs.databricks.com/_images/vertical-ellipsis.png)をクリックし、**Open in Spark UI**をクリックします。
1. クエリープロファイルを閉じるには、ページ上部の**X**をクリックします。

# クエリープロファイルの共有

別のユーザーとクエリープロファイルを共有するには、

1. [クエリー履歴](https://docs.databricks.com/sql/admin/query-history.html#view-query-history)を参照します。
1. クエリー名をクリックします。
1. クエリーを共有するには2つの選択肢があります。
    - 他のユーザーがクエリーに対する**Can Manage**権限を持っているのであれば、クエリープロファイルのURLを共有することができます。**Share**をクリックします。クリップボードにURLがコピーされます。
    - あるいは、他のユーザーが**Can Manage**権限を持っていない、ワークスペースのメンダーではない場合、JSONオブジェクトとしてクエリープロファイルをダウンロードすることができます。**Download**をクリックします。ローカルシステムにJSONファイルがダウンロードされます。

# クエリープロファイルのインポート

クエリープロファイルのJSONファイルをインポートするには、

1. [クエリー履歴](https://docs.databricks.com/sql/admin/query-history.html#view-query-history)を参照します。
1. **Import**をクリックします。
1. 共有されたJSONファイルをブラウザで選択し、**Open**をクリックします。JSONファイルがアップロードされ、クエリープロファイルが表示されます。

    クエリープロファイルをインポートすると、動的にブラウザセッションにロードされワークスペースには永続化されません。参照したい都度、再インポートする必要があります。

1. インポートしたクエリープロファイルを閉じるには、ページ上部の**X**をクリックします。

# 次のステップ

- [query history API](https://docs.databricks.com/sql/api/query-history.html)を用いたクエリーメトリクスへのアクセス方法を学びます。
- [クエリー履歴](https://docs.databricks.com/sql/admin/query-history.html)について学びます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)