Vista JOBS_TIMELINE

La vista INFORMATION_SCHEMA.JOBS_TIMELINE contiene metadatos de BigQuery casi en tiempo real por intervalo de tiempo de todos los trabajos enviados en el proyecto actual. Esta vista contiene las tareas que se están ejecutando y las que se han completado.

Permisos obligatorios

Para consultar la vista INFORMATION_SCHEMA.JOBS_TIMELINE, necesitas el permiso de bigquery.jobs.listAllGestión de Identidades y Accesos (IAM) del proyecto. Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye el permiso necesario:

  • Propietario del proyecto
  • Administrador de BigQuery

Para obtener más información sobre los permisos de BigQuery, consulta Control de acceso con gestión de identidades y accesos.

Esquema

Cuando consultas las vistas INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*, los resultados de la consulta contienen una fila por cada segundo de ejecución de cada tarea de BigQuery. Cada periodo empieza en un intervalo de un segundo y dura exactamente un segundo.

La vista INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* tiene el siguiente esquema:

Nombre de la columna Tipo de datos Valor
period_start TIMESTAMP Hora de inicio de este periodo.
period_slot_ms INTEGER Milisegundos de ranura consumidos en este periodo.
project_id STRING ID del proyecto(columna de clustering).
project_number INTEGER Número del proyecto.
user_email STRING (Columna de clustering) Dirección de correo o cuenta de servicio del usuario que ha ejecutado el trabajo.
job_id STRING ID del trabajo. Por ejemplo, bquxjob_1234.
job_type STRING El tipo de trabajo. Puede ser QUERY, LOAD, EXTRACT, COPY o NULL. Un valor de NULL indica un trabajo en segundo plano.
statement_type STRING El tipo de instrucción de consulta, si es válida. Por ejemplo, SELECT, INSERT, UPDATE o DELETE.
priority STRING La prioridad de este trabajo. Los valores válidos son INTERACTIVE y BATCH.
parent_job_id STRING ID del trabajo principal (si lo hay).
job_creation_time TIMESTAMP (Columna de partición) Hora de creación de este trabajo. La partición se basa en la hora UTC de esta marca de tiempo.
job_start_time TIMESTAMP Hora de inicio de este trabajo.
job_end_time TIMESTAMP Hora de finalización de este trabajo.
state STRING Estado de ejecución del trabajo al final de este periodo. Los estados válidos son PENDING, RUNNING y DONE.
reservation_id STRING Nombre de la reserva principal asignada a este trabajo al final de este periodo, si procede.
edition STRING Edición asociada a la reserva asignada a este trabajo. Para obtener más información sobre las ediciones, consulta Introducción a las ediciones de BigQuery.
total_bytes_billed INTEGER Si el proyecto está configurado para usar los precios bajo demanda, este campo contiene el total de bytes facturados por la tarea. Si el proyecto está configurado para usar precios de tarifa plana, no se te cobrarán los bytes y este campo solo tiene carácter informativo. Este campo solo se rellena en las tareas completadas y contiene el número total de bytes facturados durante toda la duración de la tarea.
total_bytes_processed INTEGER Total de bytes procesados por el trabajo. Este campo solo se rellena en las tareas completadas y contiene el número total de bytes procesados durante toda la duración de la tarea.
error_result RECORD Detalles del error (si procede) como ErrorProto.
cache_hit BOOLEAN Indica si los resultados de la consulta de este trabajo procedían de una caché.
period_shuffle_ram_usage_ratio FLOAT Ratio de uso de la aleatorización en el periodo seleccionado.
period_estimated_runnable_units INTEGER Unidades de trabajo que se pueden programar inmediatamente en este periodo. Los slots adicionales para estas unidades de trabajo aceleran tu consulta, siempre que ninguna otra consulta de la reserva necesite slots adicionales.
transaction_id STRING ID de la transacción en la que se ha ejecutado este trabajo (si la hay). Vista previa

Conservación de datos

Esta vista contiene los trabajos que se están ejecutando y el historial de los últimos 180 días.

Ámbito y sintaxis

Las consultas en esta vista deben incluir un calificador de región. Si no especifica un calificador regional, los metadatos se recuperan de todas las regiones. En la siguiente tabla se explica el ámbito de la región de esta vista:

Nombre de la vista Ámbito de los recursos Ámbito de la región
[PROJECT_ID.]`region-REGION`.INFORMATION_SCHEMA.JOBS_TIMELINE[_BY_PROJECT] Nivel de proyecto REGION
Sustituye lo siguiente:
  • Opcional: PROJECT_ID: el ID de tu Google Cloud proyecto. Si no se especifica, se usa el proyecto predeterminado.
  • REGION: cualquier nombre de región del conjunto de datos. Por ejemplo, `region-us`.

Ejemplos

Para ejecutar la consulta en un proyecto que no sea el predeterminado, añade el ID del proyecto con el siguiente formato:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
; por ejemplo, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.

En el siguiente ejemplo se calcula la utilización de las ranuras cada segundo del último día:

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;
Nota: Los nombres de las vistas `INFORMATION_SCHEMA` distinguen entre mayúsculas y minúsculas. El resultado es similar al siguiente:
+---------------------+---------------+
|    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 |
+---------------------+---------------+

Puedes consultar el uso de una reserva concreta con WHERE reservation_id = "…". En el caso de las tareas de secuencias de comandos, la tarea principal también informa del uso total de ranuras de sus tareas secundarias. Para evitar que se contabilicen dos veces, usa WHERE statement_type != "SCRIPT" para excluir el trabajo principal.

Número de tareas RUNNING y PENDING a lo largo del tiempo

Para ejecutar la consulta en un proyecto que no sea el predeterminado, añade el ID del proyecto con el siguiente formato:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
; por ejemplo, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE.

En el siguiente ejemplo se calcula el número de tareas RUNNING y PENDING cada segundo del último día:

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;

El resultado es similar al siguiente:

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

Uso de recursos por parte de los trabajos en un momento concreto

Para ejecutar la consulta en un proyecto que no sea el predeterminado, añade el ID del proyecto con el siguiente formato:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
; por ejemplo, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS.

En el siguiente ejemplo se devuelve el job_id de todos los trabajos que se están ejecutando en un momento específico, junto con el uso de recursos durante ese periodo de un segundo:

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' OR statement_type IS NULL);

El resultado es similar al siguiente:

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

Coincidir con el comportamiento de uso de las ranuras de los gráficos de recursos administrativos

Puedes usar gráficos de recursos administrativos para monitorizar el estado, el uso de ranuras y el rendimiento de los trabajos de BigQuery de tu organización a lo largo del tiempo. En el siguiente ejemplo, se consulta la vista INFORMATION_SCHEMA.JOBS_TIMELINE para obtener una cronología del uso de las ranuras con intervalos de una hora, similar a la información disponible en los gráficos de recursos administrativos.

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;

Calcula el porcentaje del tiempo de ejecución en el que había trabajo pendiente.

Para ejecutar la consulta en un proyecto que no sea el predeterminado, añade el ID del proyecto con el siguiente formato:

`PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.VIEW
por ejemplo, `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS.

En el siguiente ejemplo, se devuelve un valor flotante que representa el porcentaje de la duración total de la ejecución del trabajo en el que el valor de period_estimated_runnable_units era distinto de cero, lo que significa que el trabajo solicitaba más ranuras. Un valor alto indica que el trabajo ha sufrido una contienda de ranuras, mientras que un valor bajo indica que el trabajo no ha solicitado ranuras durante la mayor parte del tiempo de ejecución, lo que significa que ha habido poca o ninguna contienda de ranuras.

Si el valor resultante es grande, puedes probar a añadir más ranuras para ver el impacto y determinar si la contención de ranuras es el único cuello de botella.

SELECT ROUND(COUNTIF(period_estimated_runnable_units > 0) / COUNT(*) * 100, 1) as execution_duration_percentage
FROM `myproject`.`region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE
WHERE job_id = 'my_job_id'
GROUP BY job_id

Si conoces la fecha de ejecución de la consulta, añade una cláusula DATE(period_start) = 'YYYY-MM-DD' a la consulta para reducir la cantidad de bytes procesados y acelerar la ejecución. Por ejemplo, DATE(period_start) = '2025-08-22'.

El resultado es similar al siguiente:

+-------------------------------+
| execution_duration_percentage |
+-------------------------------+
|                          96.7 |
+-------------------------------+