Ansicht JOBS_TIMELINE

Die Ansicht INFORMATION_SCHEMA.JOBS_TIMELINE enthält BigQuery-Metadaten in nahezu Echtzeit nach Zeitabschnitt für alle Jobs, die im aktuellen Projekt gesendet wurden. Diese Ansicht enthält derzeit ausgeführte und abgeschlossene Jobs.

Erforderliche Berechtigungen

Zum Abfragen der Ansicht INFORMATION_SCHEMA.JOBS_TIMELINE benötigen Sie die IAM-Berechtigung (Identity and Access Management) bigquery.jobs.listAll für das Projekt. Jede der folgenden vordefinierten IAM-Rollen enthält die erforderliche Berechtigung:

  • Projektinhaber
  • BigQuery-Administrator

Weitere Informationen zu BigQuery-Berechtigungen finden Sie unter Zugriffssteuerung mit IAM.

Schema

Wenn Sie die INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*-Ansichten abfragen, enthalten die Ergebnisse eine Zeile für jede Ausführungssekunde des BigQuery-Jobs. Jeder Zeitraum beginnt mit einem ganzen Sekundenintervall und entspricht genau einer Sekunde.

Die Ansicht INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* hat das folgende Schema:

Spaltenname Datentyp Wert
period_start TIMESTAMP Startzeit dieses Zeitraums.
period_slot_ms INTEGER Genutzte Slotmillisekunden in diesem Zeitraum.
period_shuffle_ram_usage_ratio FLOAT Shuffle-Nutzungsverhältnis im ausgewählten Zeitraum.
project_id STRING (Clustering-Spalte) ID des Projekts
project_number INTEGER Nummer des Projekts.
user_email STRING (Clustering-Spalte) E-Mail-Adresse oder Dienstkonto des Nutzers, der den Job ausgeführt hat.
job_id STRING ID des Jobs, z. B. bquxjob_1234.
job_type STRING Typ des Jobs. Kann QUERY, LOAD, EXTRACT, COPY oder null sein. Der Jobtyp null gibt einen internen Job an, z. B. die Auswertung einer Anweisung des Skriptjobs oder die Aktualisierung der materialisierten Ansicht.
statement_type STRING Typ der Abfrageanweisung, sofern gültig. Beispiel: SELECT, INSERT, UPDATE oder DELETE.
job_creation_time TIMESTAMP (Partitionierungsspalte) Erstellungszeit dieses Jobs. Die Partitionierung basiert auf der UTC-Zeit dieses Zeitstempels.
job_start_time TIMESTAMP Startzeit dieses Jobs.
job_end_time TIMESTAMP Endzeit dieses Jobs.
state STRING Ausführungsstatus des Jobs am Ende dieses Zeitraums. Gültige Statuswerte sind PENDING, RUNNING und DONE.
reservation_id STRING Name der primären Reservierung, die diesem Job am Ende dieses Zeitraums zugewiesen wird, sofern zutreffend.
total_bytes_processed INTEGER Gesamtzahl der vom Job verarbeiteten Byte.
error_result RECORD Fehlerdetails (falls vorhanden) als ErrorProto. .
cache_hit BOOLEAN Ob die Abfrageergebnisse dieses Jobs aus einem Cache stammen.
period_estimated_runnable_units INTEGER Arbeitseinheiten, die in diesem Zeitraum sofort geplant werden können. Zusätzliche Slots für diese Arbeitseinheiten beschleunigen Ihre Abfrage, sofern keine andere Abfrage in der Reservierung zusätzliche Slots benötigt.

Datenaufbewahrung

Diese Ansicht enthält aktuell ausgeführte Jobs und den Jobverlauf der letzten 180 Tage.

Bereich und Syntax

Für Abfragen dieser Ansicht muss ein Regions-Qualifier verwendet werden. Wenn Sie keinen regionalen Qualifier angeben, werden Metadaten aus allen Regionen abgerufen. In der folgenden Tabelle wird der Regionsbereich für diese Ansicht erläutert:

Ansichtsname Ressourcenbereich Regionsbereich
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] auf Projektebene REGION
Ersetzen Sie Folgendes:

  • Optional: PROJECT_ID: die ID Ihres Google Cloud-Projekts. Wenn keine Angabe erfolgt, wird das Standardprojekt verwendet.
  • REGION: ist ein beliebiger Dataset-Regionsname. Beispiel: region-us

Beispiele

Wenn Sie die Abfrage für ein anderes Projekt als Ihr Standardprojekt ausführen möchten, fügen Sie die Projekt-ID im folgenden Format hinzu:

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

Im folgenden Beispiel wird die Slotauslastung für jede Sekunde des letzten Tages berechnet:

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;
Hinweis: Bei Ansichtsnamen vom Typ INFORMATION_SCHEMA wird zwischen Groß- und Kleinschreibung unterschieden. Das Ergebnis sieht etwa so aus:
+---------------------+---------------+
|    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 |
+---------------------+---------------+

Sie können die Nutzung einer bestimmten Reservierung mit WHERE reservation_id = "…" prüfen. Bei Skriptjobs meldet der übergeordnete Job auch die gesamte Slot-Nutzung seiner untergeordneten Jobs. Verwenden Sie zur Vermeidung einer doppelten Zählung WHERE statement_type != "SCRIPT", um den übergeordneten Job auszuschließen.

Beispiel: Anzahl von RUNNING- und PENDING-Jobs im Zeitverlauf

Wenn Sie die Abfrage für ein anderes Projekt als Ihr Standardprojekt ausführen möchten, fügen Sie die Projekt-ID im folgenden Format hinzu:

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

Im folgenden Beispiel wird die Anzahl von RUNNING- und PENDING-Jobs zu jeder Sekunde des letzten Tages berechnet:

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;

Das Ergebnis sieht etwa so aus:

+---------------------+---------+---------+
|    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 |
+---------------------+---------+---------+

Beispiel: Ressourcennutzung durch Jobs zu einem bestimmten Zeitpunkt

Wenn Sie die Abfrage für ein anderes Projekt als Ihr Standardprojekt ausführen möchten, fügen Sie die Projekt-ID im folgenden Format hinzu:

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

Im folgenden Beispiel wird die job_id aller Jobs, die zu einem bestimmten Zeitpunkt ausgeführt werden, sowie ihre Ressourcennutzung während dieses 1-Sekunden-Zeitraums zurückgegeben:

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';

Das Ergebnis sieht etwa so aus:

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

Beispiel: Slot-Nutzungsverhalten mit Admin-Ressourcendiagrammen abgleichen

Sie können administrative Ressourcendiagramme verwenden, um den Zustand Ihrer Organisation, die Slot-Nutzung und die Leistung von BigQuery-Jobs im Zeitverlauf zu überwachen. Im folgenden Beispiel wird die Ansicht INFORMATION_SCHEMA.JOBS_TIMELINE nach einer Zeitachse der Slot-Nutzung in Intervallen von einer Stunde abgefragt, ähnlich den Informationen, die in Admin-Ressourcendiagrammen verfügbar sind.

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
          `user_proj.region-US`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION
        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, "^user_proj:")
      )
    GROUP BY period_start, time_ms
  ),
  data_by_time AS (
    SELECT
      time_ms,
      SUM(period_slot_ms) / (3600000 * 1) AS submetric_value
    FROM
      snapshot_data
    GROUP BY time_ms
  )
SELECT
  time_ms,
  IFNULL(submetric_value, 0) AS submetric_value,
  "Slot Usage" AS resource_id,
  IFNULL(SUM(submetric_value) OVER () / (TIMESTAMP_DIFF(@end_time, @start_time, HOUR) / 1), 0) AS overall_average_slot_count
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;