実行時間の調査

このトピックでは、クエリと タスク の過去のパフォーマンスを調査する方法について説明します。この情報は、パフォーマンスの最適化の候補を特定するのに役立ち、最適化戦略が望ましい効果をもたらしているかどうかを確認できます。

Snowsight を使用するか、 ACCOUNT_USAGE スキーマのビューに対してクエリを記述することで、過去のパフォーマンスを調査できます。ACCOUNT_USAGE スキーマにアクセスできないユーザーは、Information Schemaを使用して同様のデータをクエリできます。

実行時間と負荷を表示する

Snowsight を使用して、クエリとタスクのパフォーマンス、およびウェアハウスの負荷を視覚的に把握できます。

クエリ
  1. Snowsight にサインインします。

  2. Activity » Query History を選択します。

  3. Duration 列を使用して、クエリの実行にかかった時間を把握します。列を並べ替えて、実行時間が最も長かったクエリを見つけることができます。

  4. 特定のユーザーのクエリに注目する場合は、 User ドロップダウンを使用してユーザーを選択します。

  5. 特定のウェアハウスで実行されたクエリに注目する場合は、 Filters » Warehouse を選択してからウェアハウスを選択します。

ウェアハウス
  1. Snowsight にサインインします。

  2. ウェアハウスに対する権限を持つロールに切り替えます。

  3. Admin » Warehouses を選択します。

  4. ウェアハウスを選択します。

  5. Warehouse Activity チャートを使用して、クエリがキューに入れられたかどうかなど、ウェアハウスの負荷を視覚化します。

タスク
  1. Snowsight にサインインします。

  2. タスクの SQL コードの実行にかかった時間を表示するには、 Activity » Task History を選択します。

実行時間をドリルダウンする

クエリプロファイル を使用すると、クエリのどの部分の実行に時間がかかっているかを調査できます。これには、実行に最も時間がかかっている演算子ノードを識別する Most Expensive Nodes ペインが含まれます。ノードの実行時間のうち、クエリ処理の特定のカテゴリに費やされた割合を表示することで、さらにドリルダウンできます。

クエリのクエリプロファイルにアクセスするには、

  1. Snowsight にサインインします。

  2. Activity » Query History を選択します。

  3. クエリのクエリ ID を選択します。

  4. Query Profile タブを選択します。

ちなみに

GET_QUERY_OPERATOR_STATS 関数を実行することにより、クエリプロファイルのパフォーマンス統計にプログラムを使用してアクセスできます。

クエリを記述して実行時間を調査する

Account Usage スキーマには、クエリとタスクの実行時間に関連するビューが含まれています。また、クエリを実行するときのウェアハウスの負荷に関連するビューも含まれています。これらのビューに対してクエリを記述して、パフォーマンスデータにドリルダウンし、カスタムレポートとダッシュボードを作成できます。

デフォルトでは、アカウント管理者(つまり、 ACCOUNTADMIN ロールを持つユーザー)のみが ACCOUNT_USAGE スキーマのビューにアクセスできます。他のユーザーがこれらのビューにアクセスできるようにするには、 他のロールに対する SNOWFLAKE データベース使用の有効化 をご参照ください。

ACCOUNT_USAGE スキーマにアクセスできないユーザー(例: クエリを実行したユーザーやウェアハウス管理者)は、Information Schemaの QUERY_HISTORY テーブル関数 を使用して、最近の実行時間やその他のクエリメタデータを返すことができます。

ACCOUNT_USAGE ビューは、クエリまたはタスクの実行直後には更新されないことに注意してください。クエリを実行した直後にその実行時間を確認する場合は、 Snowsight を使用して パフォーマンスを表示 します。Information Schemaも ACCOUNT_USAGE ビューよりも速く更新されます。

ACCOUNT_USAGE ビュー

説明

遅延

QUERY_HISTORY

過去365日間(1年間)以内のさまざまなディメンション(時間範囲、実行時間、セッション、ユーザー、ウェアハウスなど)によってSnowflakeクエリ履歴を分析するために使用します。

最大45分

WAREHOUSE_LOAD_HISTORY

指定された日付範囲内のウェアハウスのワークロードを分析するために使用します。

最大3時間

TASK_HISTORY

過去365日間(1年間)以内のタスク使用状況の履歴を取得するために使用します。

最大45分

クエリ例

ACCOUNT_USAGE スキーマに対する次のクエリは、クエリ、ウェアハウス、およびタスクの過去のパフォーマンスに関する洞察を提供します。SQL の包括的な例を表示するには、クエリの名前をクリックします。

クエリのパフォーマンス
ウェアハウスの負荷
タスクのパフォーマンス

クエリのパフォーマンス

クエリ: 実行時間の長い上位n個のクエリ

このクエリは、過去1日で実行時間が最も長いクエリの上位n位(以下の例では50位)のリストを提供します。 DATEADD 関数を調整して、より短い期間またはより長い期間に焦点を当てることができます。 my_warehouse をウェアハウスの名前に置き換えます。

SELECT query_id,
  ROW_NUMBER() OVER(ORDER BY partitions_scanned DESC) AS query_id_int,
  query_text,
  total_elapsed_time/1000 AS query_execution_time_seconds,
  partitions_scanned,
  partitions_total,
FROM snowflake.account_usage.query_history Q
WHERE warehouse_name = 'my_warehouse' AND TO_DATE(Q.start_time) > DATEADD(day,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0 --only get queries that actually used compute
  AND error_code IS NULL
  AND partitions_scanned IS NOT NULL
ORDER BY total_elapsed_time desc
LIMIT 50;
Copy
クエリ: 過去の月の実行時間別に整理されたクエリ

このクエリは、特定のウェアハウスのクエリを過去1か月の実行時間のバケット別にグループ化します。これらのクエリ完了時間の傾向は、ウェアハウスのサイズを変更したり、一部のクエリを別のウェアハウスに分離したりする決定を通知するのに役立ちます。 MY_WAREHOUSE をウェアハウスの名前に置き換えます。

SELECT
  CASE
    WHEN Q.total_elapsed_time <= 60000 THEN 'Less than 60 seconds'
    WHEN Q.total_elapsed_time <= 300000 THEN '60 seconds to 5 minutes'
    WHEN Q.total_elapsed_time <= 1800000 THEN '5 minutes to 30 minutes'
    ELSE 'more than 30 minutes'
  END AS BUCKETS,
  COUNT(query_id) AS number_of_queries
FROM snowflake.account_usage.query_history Q
WHERE  TO_DATE(Q.START_TIME) >  DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0
  AND warehouse_name = 'my_warehouse'
GROUP BY 1;
Copy
クエリ: 長く繰り返されるクエリを検索する

クエリハッシュ (ACCOUNT_USAGE QUERY_HISTORY ビューの query_hash 列の値)を使用して、明白ではないクエリパフォーマンスのパターンを見つけることができます。たとえば、クエリは1回の実行では過剰にコストがかからないかもしれませんが、頻繁に繰り返されるクエリでは、クエリの実行回数に応じてコストが上昇する可能性があります。

クエリハッシュを使用して、最初に最適化に注力すべきクエリを特定することができます。たとえば、以下のクエリは、 query_hash 列の値を使用して、上位100個の長く実行されるクエリのクエリ IDs を識別子としています。

SELECT
    query_hash,
    COUNT(*),
    SUM(total_elapsed_time),
    ANY_VALUE(query_id)
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
  WHERE warehouse_name = 'MY_WAREHOUSE'
    AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
  GROUP BY query_hash
  ORDER BY SUM(total_elapsed_time) DESC
  LIMIT 100;
Copy
クエリ: クエリの平均パフォーマンスを経時的に追跡する

以下のステートメントは、特定のパラメータークエリハッシュ(cbd58379a88c37ed6cc0ecfebb053b03)を持つすべてのクエリについて、1日の平均総経過時間を計算します。

SELECT
    DATE_TRUNC('day', start_time),
    SUM(total_elapsed_time),
    ANY_VALUE(query_id)
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
  WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
    AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
  GROUP BY DATE_TRUNC('day', start_time);
Copy

ウェアハウスの負荷

クエリ: ウェアハウスの総負荷

このクエリは、実行されたクエリとキューに入れられたクエリのウェアハウスの総負荷に関する洞察を提供します。これらの負荷値は、間隔内の特定の状態にあるすべてのクエリの合計実行時間(秒単位)と、その間隔の合計時間(秒単位)の比率を表します。

たとえば、276秒が、5分(300秒)間隔のクエリ4つの合計時間である場合、クエリ負荷値は276/300=0.92です。

 SELECT TO_DATE(start_time) AS date,
  warehouse_name,
  SUM(avg_running) AS sum_running,
  SUM(avg_queued_load) AS sum_queued
FROM snowflake.account_usage.warehouse_load_history
WHERE TO_DATE(start_time) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2
HAVING SUM(avg_queued_load) >0;
Copy

タスクのパフォーマンス

クエリ: 実行時間の最も長いタスク

このクエリは、前日に最も長く実行されているタスクをリストします。これにより、タスクによって実行されている SQL を最適化する機会を示すことができます。

SELECT DATEDIFF(seconds, query_start_time,completed_time) AS duration_seconds,*
FROM snowflake.account_usage.task_history
WHERE state = 'SUCCEEDED'
  AND query_start_time >= DATEADD (day, -1, CURRENT_TIMESTAMP())
ORDER BY duration_seconds DESC;
Copy