Estadísticas de consultas activas más antiguas

Las consultas activas más antiguas, también conocidas como las consultas en ejecución más largas, son una lista de consultas que están activas en tu base de datos, ordenadas por el tiempo que han estado en ejecución. Obtener información sobre estas consultas puede ayudar a identificar las causas la latencia y el alto uso de CPU a medida que ocurren.

Spanner proporciona una tabla integrada,SPANNER_SYS.OLDEST_ACTIVE_QUERIES, que enumera las consultas en ejecución, incluidas las que contienen declaraciones DML, ordenadas por hora de inicio, en orden ascendente. No incluye las consultas de flujos de cambios.

Si hay una gran cantidad de consultas en ejecución, los resultados podrían ser limitado a un subconjunto del total de consultas debido a las limitaciones de memoria que aplica de manera forzosa la recopilación de estos datos. Por lo tanto, Spanner proporciona una tabla adicional, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY, que muestra estadísticas de resumen de todas las consultas activas (excepto las consultas sobre flujos de cambios) Puedes recuperar información de ambas tablas integradas mediante SQL declaraciones.

En este documento, describiremos ambas tablas, mostraremos algunas consultas de ejemplo que usan estas tablas y, por último, demostrarás cómo usarlas para mitigar problemas causada por las consultas activas.

Disponibilidad

Los datos SPANNER_SYS solo están disponibles a través de interfaces de SQL; por ejemplo:

Otros métodos de lectura única que proporciona Spanner no son compatibles. SPANNER_SYS.

OLDEST_ACTIVE_QUERIES

SPANNER_SYS.OLDEST_ACTIVE_QUERIES muestra una lista de consultas activas ordenadas por la hora de inicio. Si hay una gran cantidad de consultas en ejecución, el podrían limitarse a un subconjunto del total de consultas debido a la cantidad las limitaciones que Spanner aplica en la recopilación de estos datos. Para ver estadísticas de resumen de todas las consultas activas, consulta ACTIVE_QUERIES_SUMMARY.

Esquema de la tabla

Nombre de la columna Tipo Descripción
START_TIME TIMESTAMP Es la hora de inicio de la consulta.
TEXT_FINGERPRINT INT64 La huella digital es un hash de las operaciones involucradas en la transacción.
TEXT STRING El texto de la declaración de consulta.
TEXT_TRUNCATED BOOL Es verdadero si el texto de la consulta en el campo TEXT está truncado. De lo contrario, es falso.
SESSION_ID STRING Es el ID de la sesión que ejecuta la consulta. Esto se usa para la observabilidad.
QUERY_ID STRING El ID de la consulta. Usa este ID con CALL cancel_query("query_id") para cancelar la consulta.

Consultas de ejemplo

Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con el comando client bibliotecas, Google Cloud CLI Consola de Google Cloud.

Enumerar las consultas en ejecución más antiguas

La siguiente consulta muestra una lista de las consultas en ejecución más antiguas ordenadas por el inicio hora de la consulta.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
start_time text_fingerprint text text_truncated session_id
2020-07-18T07:52:28.225877Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; Falso ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw
2020-07-18T07:54:08.622081Z -9206690983832919848 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; Falso ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ
2020-07-18T07:54:08.631744Z -105437553161169030 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 7 LIMIT 1000000; Falso ACjbPvanq3MesDNT98t64KdKAz3TlDZoCC-zgW-FJn91cJHuczQ_cOFN_Hdflw
2020-07-18T07:54:08.720011Z -9206690983832919848 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; Falso ACjbPvYIE2QHkhnmMXuAGpB4inK7yMnQjmYgQ9FoygKNaB5KCXu7Sf7f9aghYw
2020-07-18T07:54:08.731006Z 6561582859583559006 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 10 LIMIT 1000000; Falso ACjbPvYNZ06N2YyvwV0YMlSRBNDtXBqZEK-iAAyPFnFcTmshPvzWkhr034ud7w

Genera una lista de las 2 consultas en ejecución más antiguas

Una leve variación en la consulta anterior; este ejemplo muestra las 2 más antiguas las consultas en ejecución ordenadas por la hora de inicio de la consulta.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 2;
Resultado de la consulta
start_time text_fingerprint text text_truncated session_id
2020-07-18T07:52:28.225877Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; Falso ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw
2020-07-18T07:54:08.622081Z -9206690983832919848 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; Falso ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ

ACTIVE_QUERIES_SUMMARY

Como su nombre lo sugiere, la tabla integrada, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY, muestra estadísticas de resumen de todas las consultas activas. Como se muestra en el siguiente esquema, las consultas se agrupan por edad en tres buckets, o contadores, anteriores a un segundo, con más de 10 segundos de antigüedad y más de 100 segundos.

Esquema de la tabla

Nombre de la columna Tipo Descripción
ACTIVE_COUNT INT64 La cantidad total de consultas en ejecución.
OLDEST_START_TIME TIMESTAMP Un límite superior en la hora de inicio de la consulta en ejecución más antigua.
COUNT_OLDER_THAN_1S INT64 La cantidad de consultas de más de 1 segundo de antigüedad.
COUNT_OLDER_THAN_10S INT64 La cantidad de consultas de más de 10 segundos de antigüedad.
COUNT_OLDER_THAN_100S INT64 La cantidad de consultas de más de 100 segundos de antigüedad.

Una consulta se puede contar en más de uno de estos buckets. Por ejemplo, si un se ejecutó por 12 segundos, se contará en COUNT_OLDER_THAN_1S y COUNT_OLDER_THAN_10S porque satisface tanto con tus criterios.

Consultas de ejemplo

Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con el comando client bibliotecas, gcloud spanner o el Consola de Google Cloud.

Recuperar un resumen de las consultas activas

La siguiente consulta muestra las estadísticas de resumen sobre las consultas en ejecución.

SELECT active_count,
       oldest_start_time,
       count_older_than_1s,
       count_older_than_10s,
       count_older_than_100s
FROM spanner_sys.active_queries_summary;
Resultado de la consulta
active_count oldest_start_time count_older_than_1s count_older_than_10s count_older_than_100s
22 2020-07-18T07:52:28.225877Z 21 21 1

Limitaciones

Si bien el objetivo es brindarte la información más completa posible, hay algunas circunstancias en las cuales las consultas no se incluyen en los datos mostrados en estas tablas.

  • Las consultas DML (UPDATE/INSERT/DELETE) no se incluyen si están en la fase Apply mutations.

  • No se incluye una consulta si está en medio de un reinicio debido a error transitorio.

  • No se incluyen las consultas de servidores sobrecargados o que no responden.

  • No se puede usar OLDEST_ACTIVE_QUERIES en una transacción de lectura y escritura. Incluso en un transacción de solo lectura, ignora la marca de tiempo de la transacción y siempre muestra datos actuales al momento de su ejecución. En casos excepcionales, es posible que muestre un ABORTED. error con resultados parciales; en ese caso, descarta los resultados parciales y intenta realizar la consulta de nuevo.

Usa los datos de consultas activas para solucionar problemas de uso de CPU elevado

Estadísticas de consultas y estadísticas de transacciones proporcionar información útil a la hora de solucionar problemas de latencia en una base de datos de Spanner. Estas herramientas proporcionan información sobre el consultas que ya se completaron. Sin embargo, a veces es necesario saber lo que se ejecuta en el sistema. Por ejemplo, considera la situación en la que El uso de CPU es bastante alto, y quieres responder las siguientes preguntas.

  • ¿Cuántas consultas se están ejecutando en este momento?
  • ¿Qué son estas consultas?
  • Cuántas consultas se están ejecutando durante mucho tiempo, es decir, más de 100 segundos?
  • ¿Qué sesión ejecuta la consulta?

Con las respuestas a las preguntas anteriores, podrías decidir hacer lo siguiente: acción.

  • Borra la sesión que ejecuta la consulta para obtener una resolución inmediata.
  • Agrega un índice para mejorar el rendimiento de las consultas.
  • Reduce la frecuencia de la consulta si está asociada con una consulta tarea en segundo plano.
  • Identificar al usuario o componente que hace la consulta y para el cual es posible que no tenga autorización ejecutar la consulta.

En esta explicación, examinaremos nuestras consultas activas y determinaremos qué acción tomar.

Recuperar un resumen de las consultas activas

En la situación de ejemplo, notamos un uso de CPU más alto de lo normal, por lo que decidimos Ejecuta la siguiente consulta para obtener un resumen de las consultas activas.

SELECT active_count,
       oldest_start_time,
       count_older_than_1s,
       count_older_than_10s,
       count_older_than_100s
FROM spanner_sys.active_queries_summary;

La consulta muestra los siguientes resultados.

active_count oldest_start_time count_older_than_1s count_older_than_10s count_older_than_100s
22 2020-07-18T07:52:28.225877Z 21 21 1

Resulta que tenemos una consulta que se está ejecutando durante más de 100 segundos. Esto es inusual en nuestra base de datos, por lo que queremos investigar más a fondo.

Recupera una lista de consultas activas

En el paso anterior, determinamos que una consulta se ejecuta durante más de 100 segundos. Para investigar más a fondo, ejecutamos la siguiente consulta con el fin de mostrar más información sobre las 5 consultas en ejecución más antiguas.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id,
       query_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;

En este ejemplo, ejecutamos la consulta el 28 de marzo de 2024 aproximadamente a las 16:44:09 p.m. EDT y devolvió los siguientes resultados. (es posible que debas desplazarte horizontalmente para ver todo el resultado).

start_time text_fingerprint text text_truncated session_id query_id
2024-03-28 16:44:09.356939+00:00 -2833175298673875968 seleccionar * de spanner_sys.oldest_active_queries falso ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw 37190103859320827
2020-07-18T07:52:28.225877Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; falso ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ 48946620525959556

La consulta más antigua (huella digital = -2833175298673875968) se destaca en el desde una tabla de particiones. Es un CROSS JOIN costoso. Decidimos tomar medidas.

Cancela una consulta costosa

En este ejemplo, encontramos una consulta que ejecutaba un CROSS JOIN costoso, así que decidimos cancelar la consulta. Los resultados de la consulta que recibimos el paso incluía un query_id. Podemos ejecutar lo siguiente El comando CALL cancel_query(query_id) para GoogleSQL y para Comando spanner.cancel_query(query_id) para PostgreSQL en cancelar la consulta.

GoogleSQL

CALL cancel_query(query_id)

PostgreSQL

CALL spanner.cancel_query(query_id)

Por ejemplo, a continuación, la sentencia CALL cancela una consulta con el ID 37190103859320827:

CALL cancel_query(37190103859320827)

Debes consultar la tabla spanner_sys.oldest_active_queries para verificar que se cancela la consulta.

En esta explicación, se muestra cómo usar SPANNER_SYS.OLDEST_ACTIVE_QUERIES y SPANNER_SYS.ACTIVE_QUERIES_SUMMARY para analizar nuestras consultas en ejecución y realizar acción, si es necesario, en las consultas que contribuyen al uso elevado de CPU. De por supuesto, siempre es más económico evitar las operaciones costosas y diseñar la el esquema adecuado para tus casos de uso. Para obtener más información sobre la construcción de SQL que se ejecuten de forma eficiente, consulta las prácticas recomendadas de SQL.

¿Qué sigue?