Las consultas activas más antiguas, también conocidas como consultas en ejecución más largas, son una lista de las consultas que se encuentran activas en tu base de datos actualmente, ordenadas por el tiempo que han estado{101. }ejecutando. Obtener estadísticas sobre estas consultas puede ayudar a identificar las causas de la latencia del sistema y el uso elevado de CPU a medida que ocurren.
Cloud Spanner proporciona una tabla incorporada, SPANNER_SYS.OLDEST_ACTIVE_QUERIES
, que enumera consultas en ejecución, incluidas las consultas que contienen declaraciones DML, ordenadas por hora de inicio, en orden ascendente.
Si hay una gran cantidad de consultas en ejecución en este momento, los resultados pueden estar limitados a un subconjunto de consultas totales debido a las restricciones de memoria que el sistema aplica en la recopilación de estos datos. Por lo tanto, Cloud Spanner proporciona una tabla adicional, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
, que muestra estadísticas de resumen de todas las consultas activas. Puedes recuperar información de ambas tablas integradas mediante instrucciones de SQL.
En este artículo, describiremos ambas tablas, mostraremos algunas consultas de ejemplo que usan estas tablas y, por último, mostraremos cómo usarlas para ayudar a mitigar los problemas que generan las consultas activas.
Disponibilidad
Los datos SPANNER_SYS
solo están disponibles a través de interfaces de SQL (por ejemplo, executeQuery
y gcloud spanner databases execute-sql
); otros métodos de lectura únicos que proporciona Cloud Spanner no son compatibles con SPANNER_SYS
.
OLDEST_ACTIVE_QUERIES
SPANNER_SYS.OLDEST_ACTIVE_QUERIES
muestra una lista de consultas activas ordenadas por hora de inicio. Si hay una gran cantidad de consultas en ejecución en este momento, los resultados pueden estar limitados a un subconjunto de consultas totales debido a las restricciones de memoria que Cloud Spanner aplica sobre la recopilación de estos datos. Para ver las 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 |
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 |
Verdadero si el texto de la consulta del campo TEXT se trunca; De lo contrario, es falso. |
SESSION_ID |
STRING |
El ID de la sesión que ejecuta la consulta. Borrar el ID de sesión cancelará la consulta. |
Consultas de ejemplo
Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con las bibliotecas cliente, la herramienta de línea de comandos de gcloud
o la Cloud Console.
Enumera 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 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;
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
En este ejemplo, una variación pequeña en la consulta anterior, muestra las 2 consultas en ejecución más antiguas ordenadas por 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 para todas las consultas activas. Como se muestra en el siguiente esquema, las consultas se agrupan por edad en tres depósitos, o contadores, de 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 |
La cantidad total de consultas que están actualmente en ejecución. |
OLDEST_START_TIME |
TIMESTAMP |
Un límite superior en el tiempo de inicio de la consulta en ejecución más antigua. |
COUNT_OLDER_THAN_1S |
INT64 |
La cantidad de consultas que tienen más de 1 segundo. |
COUNT_OLDER_THAN_10S |
INT64 |
La cantidad de consultas que duran más de 10 segundos. |
COUNT_OLDER_THAN_100S |
INT64 |
La cantidad de consultas que superen los 100 segundos. |
Una consulta se puede contar en más de uno de estos depósitos. Por ejemplo, si una consulta se ejecutó durante 12 segundos, se contará en COUNT_OLDER_THAN_1S
y COUNT_OLDER_THAN_10S
porque satisface ambos criterios.
Consultas de ejemplo
Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con las bibliotecas cliente, la herramienta de línea de comandos de gcloud
o la Cloud Console.
Recupera un resumen de consultas activas
La siguiente consulta muestra las estadísticas de resumen sobre la ejecución de consultas.
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 del reinicio debido a un error transitorio.
No se incluyen las consultas de los servidores sobrecargados o que no responden.
No se puede usar
OLDEST_ACTIVE_QUERIES
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, puede mostrar un errorABORTED
con resultados parciales. En ese caso, descarta los resultados parciales y vuelve a realizar la consulta.
Usa datos de consultas activas para solucionar problemas de uso de CPU
Las estadísticas de consultas y las estadísticas de transacciones proporcionan información útil para solucionar problemas de latencia en una base de datos de Cloud Spanner. Estas herramientas proporcionan información sobre las consultas que ya se completaron. Sin embargo, a veces es necesario saber qué se está ejecutando actualmente en el sistema. Por ejemplo, considera una situación en la que el uso de CPU es muy alto y deseas responder las siguientes preguntas.
- ¿Cuántas consultas se están ejecutando en este momento?
- ¿Qué son estas consultas?
- ¿Cuántas consultas se ejecutan durante un tiempo prolongado, es decir, más de 100 segundos?
- ¿Qué sesión está ejecutando la consulta?
Con las respuestas a las preguntas anteriores, podrías optar por realizar la siguiente acción.
- Borra la sesión que ejecuta la consulta para obtener una resolución inmediata.
- Agregue un índice para mejorar el rendimiento de las consultas.
- Reducir la frecuencia de la consulta si está asociada con una tarea periódica en segundo plano
- Identifica el usuario o componente que emite la consulta y que no está autorizada para ejecutarla.
En esta explicación, examinaremos nuestras consultas activas y determinaremos qué medidas tomar, si las hubiera.
Recupera un resumen de las consultas que están activas
En nuestro caso de ejemplo, notamos un uso de CPU más alto que el 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 genera 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 |
Actualmente, tenemos una consulta que se está ejecutando por más de 100 segundos. Esto es inusual en nuestra base de datos, por lo que queremos investigar en profundidad.
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
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;
En este ejemplo, ejecutamos la consulta el sábado 18 de julio de 2020 a las 12:54:18 a.m. PDT y obtuvo los siguientes resultados. Es posible que debas desplazarte horizontalmente para ver la salida completa.
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; |
False |
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 |
La consulta más antigua (huella digital = -3426560921851907385
) está destacada en la tabla. Es un servicio CROSS JOIN
costoso. Decidimos tomar medidas.
Cancela una consulta costosa
Encontramos una consulta que ejecutaba un CROSS JOIN
costoso, por lo que decidimos cancelar la consulta. Los resultados de la consulta en el paso anterior incluyen un session_id
, que es el ID de la sesión que ejecuta la consulta. Por lo tanto, podemos ejecutar el siguiente comando gcloud spanner databases sessions delete
para borrar la sesión con ese ID que, a su vez, cancela la consulta.
gcloud spanner databases sessions delete\
ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw \
--database=singer_db --instance=test-instance
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 cualquier consulta que contribuya a un uso de CPU elevado. Por supuesto, siempre es más económico evitar las operaciones costosas y diseñar el esquema adecuado para tus casos prácticos. Para obtener más información sobre cómo crear instrucciones de SQL que se ejecutan de manera eficiente, consulta las prácticas recomendadas de SQL.
¿Qué sigue?
- Obtén más información sobre otras herramientas de introspección.
- Aprende sobre qué otra información Cloud Spanner almacena para cada base de datos en las tablas de esquema de información de la base de datos.
- Obtén más información sobre las prácticas recomendadas de SQL para Cloud Spanner.