JOBS_TIMELINE ビュー

INFORMATION_SCHEMA.JOBS_TIMELINE ビューには、現在のプロジェクトで送信されたすべてのジョブのタイムスライスごとのニア リアルタイムの BigQuery メタデータが含まれます。このビューには、現在実行中のジョブと完了したジョブが表示されます。

必要な権限

INFORMATION_SCHEMA.JOBS_TIMELINE ビューをクエリするには、プロジェクトの bigquery.jobs.listAll Identity and Access Management(IAM)権限が必要です。次に示す各 IAM の事前定義ロールには、必要な権限が含まれています。

  • プロジェクト オーナー
  • BigQuery 管理者

BigQuery の権限の詳細については、IAM でのアクセス制御をご覧ください。

スキーマ

INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* ビューに対してクエリを実行すると、クエリ結果にすべての BigQuery ジョブについて 1 秒ごとの実行結果を示す行が 1 行ずつ表示されます。各期間は整数秒の時点で開始し、厳密に 1 秒間継続します。

INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* ビューのスキーマは次のとおりです。

列名 データ型
period_start TIMESTAMP この期間の開始時間。
period_slot_ms INTEGER この期間に使用したスロットのミリ秒数。
project_id STRING (クラスタリング列)プロジェクトの ID。
project_number INTEGER プロジェクトの番号。
user_email STRING (クラスタリング列)ジョブを実行したユーザーのメールアドレスまたはサービス アカウント。
job_id STRING ジョブの ID。例: bquxjob_1234
job_type STRING ジョブのタイプ。QUERYLOADEXTRACTCOPY、または NULL のいずれかです。NULL 値はバックグラウンド ジョブを示します。
statement_type STRING クエリ ステートメントのタイプ(有効な場合)。例: SELECTINSERTUPDATE、または DELETE
priority STRING このジョブの優先度。有効な値として、INTERACTIVEBATCH があります。
parent_job_id STRING 親ジョブの ID(存在する場合)。
job_creation_time TIMESTAMP (パーティショニング列)このジョブの作成時間。パーティショニングは、このタイムスタンプの UTC 時間に基づきます。
job_start_time TIMESTAMP このジョブの開始時間。
job_end_time TIMESTAMP このジョブの終了時間。
state STRING この期間の終了時点におけるジョブの実行状態。有効な状態には PENDINGRUNNINGDONE があります。
reservation_id STRING この期間の終了時点でこのジョブに割り当てられているメイン予約の名前(該当する場合)。
edition STRING このジョブに割り当てられた予約に関連付けられているエディション。エディションの詳細については、BigQuery エディションの概要をご覧ください。
total_bytes_billed INTEGER オンデマンド料金を使用するようにプロジェクトが構成されている場合、このフィールドにはジョブに対して課金された合計バイト数が含まれます。プロジェクトが定額料金を使用するように設定されている場合、バイト数に対しては課金されず、このフィールドは情報提供のみを目的としたものになります。
total_bytes_processed INTEGER ジョブによって処理された合計バイト数。
error_result RECORD ErrorProto. としてのエラー(ある場合)の詳細。
cache_hit BOOLEAN このジョブのクエリ結果がキャッシュから取得されたかどうか。
period_shuffle_ram_usage_ratio FLOAT 選択した期間のシャッフル使用率。
period_estimated_runnable_units INTEGER この期間にすぐにスケジュール設定できる作業単位。予約内の他のクエリで追加のスロットが必要ない場合は、これらの作業単位でスロットを追加することでクエリが高速化されます。
transaction_id STRING このジョブが実行されたトランザクションの ID(存在する場合)。(プレビュー

データの保持

このビューには、現在実行中のジョブと過去 180 日間のジョブの履歴が含まれます。

スコープと構文

このビューに対するクエリでは、リージョン修飾子を指定する必要があります。リージョン修飾子を指定しない場合、メタデータはすべてのリージョンで取得されます。次の表で、このビューのリージョン スコープを説明します。

ビュー名 リソース スコープ リージョン スコープ
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] プロジェクト レベル REGION
次のように置き換えます。
  • 省略可: PROJECT_ID: Google Cloud プロジェクトの ID。指定しない場合は、デフォルトのプロジェクトが使用されます。
  • REGION: 任意のデータセット リージョン名。例: `region-us`

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
例: `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE

次の例では、前日における 1 秒ごとのスロット使用率を計算しています。

SELECT
  period_start,
  SUM(period_slot_ms) AS total_slot_ms,
FROM
  `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
WHERE
  period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP()
GROUP BY
  period_start
ORDER BY
  period_start DESC;
注: `INFORMATION_SCHEMA` ビュー名では大文字と小文字が区別されます。次のような結果になります。
+---------------------+---------------+
|    period_start     | total_slot_ms |
+---------------------+---------------+
| 2020-07-29 03:52:14 |     122415176 |
| 2020-07-29 03:52:15 |     141107048 |
| 2020-07-29 03:52:16 |     173335142 |
| 2020-07-28 03:52:17 |     131107048 |
+---------------------+---------------+

特定の予約の使用状況は WHERE reservation_id = "…" で確認できます。スクリプト ジョブの場合、親ジョブは子ジョブからのスロットの合計使用状況も報告します。重複してカウントされないように、WHERE statement_type != "SCRIPT" を使用して親ジョブを除外します。

例: RUNNING ジョブと PENDING ジョブの数の推移

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
例: `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE

次の例では、前日における 1 秒ごとの RUNNING ジョブと PENDING ジョブの数を計算しています。

SELECT
  period_start,
  SUM(IF(state = "PENDING", 1, 0)) as PENDING,
  SUM(IF(state = "RUNNING", 1, 0)) as RUNNING
FROM
  `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
WHERE
  period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP()
GROUP BY
  period_start;

次のような結果になります。

+---------------------+---------+---------+
|    period_start     | PENDING | RUNNING |
+---------------------+---------+---------+
| 2020-07-29 03:52:14 |       7 |      27 |
| 2020-07-29 03:52:15 |       1 |      21 |
| 2020-07-29 03:52:16 |       5 |      21 |
| 2020-07-29 03:52:17 |       4 |      22 |
+---------------------+---------+---------+

例: 特定の時点におけるジョブ別のリソース使用量

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID を追加します。

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
例: `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS

次の例では、特定の時点で実行されているすべてのジョブの job_id と、それらのジョブの 1 秒間におけるリソース使用量を返しています。

SELECT
  job_id,
  period_slot_ms
FROM
  `reservation-admin-project.region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT
WHERE
  period_start = '2020-07-29 03:52:14'
  AND statement_type != 'SCRIPT';

次のような結果になります。

+------------------+
| job_id | slot_ms |
+------------------+
| job_1  | 2415176 |
| job_2  | 4417245 |
| job_3  |  427416 |
| job_4  | 1458122 |
+------------------+

例: 管理リソースグラフからスロット使用状況を照合する

管理リソースグラフを使用すると、組織の健全性、スロットの使用状況、BigQuery ジョブのパフォーマンスを経時的にモニタリングできます。次の例では、スロット使用のタイムラインを確認するために、1 時間間隔で INFORMATION_SCHEMA.JOBS_TIMELINE ビューに対してクエリを実行します。これにより、管理リソースグラフで入手可能な情報と同様の情報を取得できます。

DECLARE
  start_time timestamp DEFAULT TIMESTAMP(START_TIME);
DECLARE
  end_time timestamp DEFAULT TIMESTAMP(END_TIME);

WITH
  snapshot_data AS (
  SELECT
    UNIX_MILLIS(period_start) AS period_start,
    IFNULL(SUM(period_slot_ms), 0) AS period_slot_ms,
    DIV(UNIX_MILLIS(period_start), 3600000 * 1) * 3600000 * 1 AS time_ms
  FROM (
    SELECT
      *
    FROM
      `PROJECT_ID.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_PROJECT
    WHERE
      ((job_creation_time >= TIMESTAMP_SUB(start_time, INTERVAL 1200 MINUTE)
          AND job_creation_time < TIMESTAMP(end_time))
        AND period_start >= TIMESTAMP(start_time)
        AND period_start < TIMESTAMP(end_time))
      AND (statement_type != "SCRIPT"
        OR statement_type IS NULL)
      AND REGEXP_CONTAINS(reservation_id, "^PROJECT_ID:") )
  GROUP BY
    period_start,
    time_ms ),
  converted_percentiles_data AS (
  SELECT
    time_ms,
    100 - CAST(SAFE_DIVIDE(3600000 * 1 * 1 / 1000, COUNT(*)) AS INT64) AS converted_percentiles,
  FROM
    snapshot_data
  GROUP BY
    time_ms ),
  data_by_time AS (
  SELECT
    time_ms,
  IF
    (converted_percentiles <= 0, 0, APPROX_QUANTILES(period_slot_ms, 100)[SAFE_OFFSET(converted_percentiles)] / 1000) AS p99_slots,
    SUM(period_slot_ms) / (3600000 * 1) AS avg_slots
  FROM
    snapshot_data
  JOIN
    converted_percentiles_data AS c
  USING
    (time_ms)
  GROUP BY
    time_ms,
    converted_percentiles )
SELECT
  time_ms,
  TIMESTAMP_MILLIS(time_ms) AS time_stamp,
  IFNULL(avg_slots, 0) AS avg_slots,
  IFNULL(p99_slots, 0) AS p99_slots,
FROM (
  SELECT
    time_ms * 3600000 * 1 AS time_ms
  FROM
    UNNEST(GENERATE_ARRAY(DIV(UNIX_MILLIS(start_time), 3600000 * 1), DIV(UNIX_MILLIS(end_time), 3600000 * 1) - 1, 1)) AS time_ms )
LEFT JOIN
  data_by_time
USING
  (time_ms)
ORDER BY
  time_ms DESC;