Consultas activas más antiguas, también conocidas como consultas en ejecución más largas, es una lista de consultas que están activas en tu base de datos, ordenadas por el tiempo que llevan en ejecución. Obtener estadísticas sobre estas consultas puede ayudar a identificar las causas de la latencia del sistema y el uso alto de CPU a medida que ocurren.
Spanner proporciona una tabla incorporada, SPANNER_SYS.OLDEST_ACTIVE_QUERIES
, que enumera las consultas en ejecución, incluidas las consultas que contienen declaraciones DML, ordenadas por hora de inicio, en orden ascendente. No incluye consultas de flujo 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 de flujo de cambios).
Puedes recuperar información de ambas tablas integradas con instrucciones SQL.
En este documento, describiremos ambas tablas, mostraremos algunas consultas de ejemplo que las usan y, por último, demostraremos cómo usarlas para ayudar a mitigar los problemas que causan las consultas activas.
Disponibilidad
Los datos SPANNER_SYS
solo están disponibles a través de interfaces de SQL; por ejemplo:
La página de Spanner Studio de una base de datos en la consola de Google Cloud
El comando
gcloud spanner databases execute-sql
La API de
executeQuery
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, los resultados pueden estar limitados a un subconjunto del total de consultas debido a las restricciones de memoria que Spanner aplica a 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. Usas este ID con CALL cancel_query(query_id) para cancelar la consulta. |
Consultas de ejemplo
Puedes ejecutar los siguientes ejemplos de instrucciones SQL con las bibliotecas cliente, Google Cloud CLI o la 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 |
Muestra las 2 consultas en ejecución más antiguas
Este ejemplo, que es una ligera variación de la consulta anterior, muestra las 2 consultas en ejecución más antiguas 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 antigüedad en tres segmentos o contadores: más de un segundo, más de 10 segundos y más de 100 segundos.
Esquema de la tabla
Nombre de la columna | Tipo | Descripción |
---|---|---|
ACTIVE_COUNT |
INT64 |
Es la cantidad total de consultas que se están ejecutando. |
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 |
Es la cantidad de consultas que tienen más de 100 segundos de antigüedad. |
Una consulta se puede contar en más de uno de estos buckets. Por ejemplo, si una consulta se ejecuta durante 12 segundos, se registrará en COUNT_OLDER_THAN_1S
y COUNT_OLDER_THAN_10S
porque satisface ambos criterios.
Consultas de ejemplo
Puedes ejecutar los siguientes ejemplos de instrucciones de SQL con las bibliotecas cliente, gcloud spanner o Google Cloud Console.
Cómo 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 las estadísticas más completas posibles, hay algunas circunstancias en las que las consultas no se incluyen en los datos que se muestran 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.
OLDEST_ACTIVE_QUERIES
no se puede usar en una transacción de lectura y escritura. Incluso en una transacción de solo lectura, ignora la marca de tiempo de la transacción y siempre muestra los datos actuales a partir de su ejecución. En casos excepcionales, es posible que devuelva un errorABORTED
con resultados parciales. En ese caso, descarta los resultados parciales y vuelve a intentar la consulta.
Usa datos de consultas activas para solucionar problemas de uso alto de CPU
Las estadísticas de consultas y las estadísticas de transacciones proporcionan información útil cuando se solucionan problemas de latencia en una base de datos de Spanner. Estas herramientas proporcionan información sobre las 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 la 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, puedes decidir tomar la 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 tarea en segundo plano periódica.
- Identifica el usuario o el componente que emite la consulta, que puede no estar autorizado para ejecutarla.
En esta explicación, examinamos nuestras consultas activas y determinamos qué acción, si corresponde, debemos realizar.
Cómo recuperar un resumen de las consultas activas
En nuestro ejemplo, notamos un uso de CPU superior al normal, por lo que decidimos ejecutar la siguiente consulta para mostrar 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 ejecuta 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 en el paso anterior
incluían un query_id
. Podemos ejecutar el siguiente comando CALL cancel_query(query_id)
para GoogleSQL y el comando spanner.cancel_query(query_id)
para PostgreSQL para 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 canceló 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 tomar medidas, si es necesario, en las consultas que contribuyen a un uso elevado de la CPU. Por supuesto, siempre es más económico evitar operaciones costosas y diseñar el esquema correcto para tus casos de uso. Para obtener más información sobre cómo crear instrucciones SQL que se ejecuten de manera eficiente, consulta las prácticas recomendadas de SQL.
¿Qué sigue?
- Obtén más información sobre otras herramientas de introspección.
- Más información sobre otros datos que Spanner almacena para cada base de datos en las tablas del esquema de información de la base de datos.
- Obtén más información sobre las prácticas recomendadas de SQL para Spanner