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.listAll
Gestió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 |
-
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
`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;
+---------------------+---------------+ | 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
`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
`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
`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 | +-------------------------------+