Consultas activas más antiguas, también conocidas como consultas de mayor duración, es una lista de consultas que están activas en tu base de datos, ordenadas según el tiempo que se han estado ejecutando. 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 instrucciones DML, ordenadas por hora de inicio, en orden ascendente. No incluye consultas de flujos de cambios.
Si hay muchas consultas en ejecución, los resultados pueden estar limitados a un subconjunto del total de consultas debido a las restricciones de memoria que el sistema aplica a 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 para todas las consultas activas (excepto las consultas de flujos de cambios).
Puedes recuperar información de ambas tablas integradas con instrucciones de 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 causados por las consultas activas.
Accede a las estadísticas de las consultas activas más antiguas
Los datos SPANNER_SYS solo están disponibles a través de interfaces de SQL; por ejemplo:
La página Spanner Studio de una base de datos en la consola de Google Cloud
El comando
gcloud spanner databases execute-sqlEl método
executeSqlo el métodoexecuteStreamingSql
Spanner no admite SPANNER_SYS con los siguientes métodos de lectura única:
- Realizar una lectura sólida desde una o varias filas de una tabla
- Realizar una lectura inactiva desde una o varias filas en una tabla
- Leer desde una o varias filas en un índice secundario
Estadísticas de OLDEST_ACTIVE_QUERIES
SPANNER_SYS.OLDEST_ACTIVE_QUERIES devuelve una lista de las búsquedas activas ordenadas por hora de inicio. Si hay muchas consultas en ejecución, los resultados pueden limitarse 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 las estadísticas de resumen de todas las consultas activas, consulta ACTIVE_QUERIES_SUMMARY.
Esquema de la tabla de estadísticas de todas las consultas activas más antiguas
| Nombre de la columna | Tipo | Descripción |
|---|---|---|
START_TIME |
TIMESTAMP |
Es la hora de inicio de la búsqueda. |
TEXT_FINGERPRINT |
INT64 |
La huella digital es un hash de la etiqueta de la solicitud o, si no hay una etiqueta, un hash del texto de la búsqueda. |
TEXT |
STRING |
El texto de la declaración de consulta. |
TEXT_TRUNCATED |
BOOL |
Si el texto de la búsqueda en el campo TEXT se trunca, este valor es TRUE. Si el texto de la búsqueda no se trunca, este valor es FALSE.
|
SESSION_ID |
STRING |
Es el ID de la sesión que ejecuta la consulta. |
QUERY_ID |
STRING |
El ID de la consulta. Puedes usar este ID con
CALL cancel_query(query_id) para cancelar la búsqueda. |
CLIENT_IP_ADDRESS |
STRING |
Es la dirección IP del cliente que solicitó la búsqueda. A veces, la dirección IP del cliente puede ocultarse. La dirección IP que se muestra aquí coincide con los registros de auditoría y sigue los mismos lineamientos de ocultamiento. Para obtener más información, consulta Dirección IP de la entidad que llama en los registros de auditoría. Te recomendamos que solicites la dirección IP del cliente solo cuando sea necesaria, ya que las solicitudes de direcciones IP del cliente pueden generar latencia adicional. |
API_CLIENT_HEADER |
STRING |
Es el encabezado api_client del cliente.
|
USER_AGENT_HEADER |
STRING |
Es el encabezado user_agent que Spanner recibió
del cliente.
|
SERVER_REGION |
STRING |
Es la región en la que el servidor raíz de Spanner procesa la consulta. Para obtener más información, consulta Ciclo de vida de una búsqueda. |
PRIORITY |
STRING |
Es la prioridad de la búsqueda. Para ver las prioridades disponibles, consulta RequestOptions. |
TRANSACTION_TYPE |
STRING |
Es el tipo de transacción de la búsqueda. Los valores posibles son READ_ONLY, READ_WRITE y NONE. |
Consultas de ejemplo
Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con las bibliotecas cliente, Google Cloud CLI o la consola deGoogle Cloud .
Enumera las consultas activas más antiguas en ejecución
La siguiente consulta devuelve 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,
query_id,
api_client_header,
server_region,
priority,
transaction_type
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
Resultado de la consulta
En la siguiente tabla, se muestra el resultado de ejecutar la consulta mencionada anteriormente:
| start_time | text_fingerprint | text | text_truncated | session_id | query_id | api_client_header | server_region | priority | transaction_type |
|---|---|---|---|---|---|---|---|---|---|
| 2025-05-20T03:29:54.287255Z | -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 | AG46FS6K3adF | 9023439241169932454 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_HIGH | READ_ONLY |
| 2025-05-20T03:31:52.40808Z | 1688332608621812214 | 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 | AG46FS6paJPKDOb | 2729381896189388167 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_HIGH | READ_WRITE |
| 2025-05-20T03:31:52.591212Z | 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 | AG46FS7Pb_9H6J6p | 9125776389780080794 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_LOW | READ_ONLY |
Muestra las 2 consultas en ejecución más antiguas
Este ejemplo, que es una pequeña variación de la consulta anterior, devuelve 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
En la siguiente tabla, se muestra el resultado de ejecutar la consulta mencionada anteriormente:
| start_time | text_fingerprint | text | text_truncated | session_id |
|---|---|---|---|---|
| 2039-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 | ACjbPvYsuRt |
| 2039-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 | ACjbPvaF3yK |
ACTIVE_QUERIES_SUMMARY
La tabla de estadísticas SPANNER_SYS.ACTIVE_QUERIES_SUMMARY muestra estadísticas de resumen para todas las búsquedas activas. Las búsquedas se agrupan en las siguientes buckets:
- Más de 1 segundo
- Más antiguo que 10 segundos
- más antigua que 100 segundos
Esquema de la tabla para ACTIVE_QUERIES_SUMMARY
| Nombre de la columna | Tipo | Descripción |
|---|---|---|
ACTIVE_COUNT |
INT64 |
Es la cantidad total de consultas en ejecución. |
OLDEST_START_TIME |
TIMESTAMP |
Es un límite superior para la hora de inicio de la consulta en ejecución más antigua. |
COUNT_OLDER_THAN_1S |
INT64 |
Es la cantidad de búsquedas que tardaron más de 1 segundo. |
COUNT_OLDER_THAN_10S |
INT64 |
Es la cantidad de búsquedas que tienen más de 10 segundos. |
COUNT_OLDER_THAN_100S |
INT64 |
Es la cantidad de búsquedas que tienen más de 100 segundos. |
Una búsqueda se puede contabilizar en más de uno de estos buckets. Por ejemplo, si una búsqueda se ejecutó durante 12 segundos, se contabilizará 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, gcloud spanner o la consola deGoogle Cloud .
Recupera un resumen de las consultas activas
La siguiente consulta devuelve 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 | 2039-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 búsquedas 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 búsqueda si está en medio de un reinicio debido a un error transitorio.
No se incluyen las búsquedas de servidores sobrecargados o que no responden.
No se puede leer ni consultar la tabla
OLDEST_ACTIVE_QUERIESen 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 devuelve los datos actuales a partir de su ejecución. En casos excepcionales, puede devolver un errorABORTEDcon resultados parciales. En ese caso, descarta los resultados parciales y vuelve a intentar la búsqueda.Si la columna
CLIENT_IP_ADDRESSdevuelve una cadena<error>, indica un problema transitorio que no debería afectar el resto de la consulta. Vuelve a intentar la consulta para recuperar la dirección IP del cliente.
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 cuando se solucionan problemas de latencia en una base de datos de Spanner. Estas herramientas proporcionan información sobre las búsquedas que ya se completaron. Sin embargo, a veces es necesario saber qué se está ejecutando 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 búsquedas?
- ¿Cuántas consultas se ejecutan durante mucho tiempo, es decir, más de 100 segundos?
- ¿Qué sesión está ejecutando la consulta?
Con las respuestas a las preguntas anteriores, podrías decidir tomar las siguientes medidas.
- Borra la sesión que ejecuta la consulta para obtener una resolución inmediata.
- Mejora el rendimiento de la consulta agregando un índice.
- Reduce la frecuencia de la consulta si está asociada a una tarea en segundo plano periódica.
- Identifica al usuario o componente que emite la consulta, que puede no estar autorizado para ejecutarla.
En este recorrido, examinaremos nuestras búsquedas activas y determinaremos qué acción tomar, si es que hay alguna.
Recupera un resumen de las consultas activas
En nuestro ejemplo, notamos un uso de CPU más alto de lo normal, por lo que decidimos ejecutar la siguiente consulta para devolver 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 arroja los siguientes resultados.
| active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
|---|---|---|---|---|
22 |
2039-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 las búsquedas 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 a las 16:44:09 EDT aproximadamente y mostró 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 | select * from spanner_sys.oldest_active_queries | falso | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw | 37190103859320827 |
| 2039-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 búsqueda más antigua (huella digital = -2833175298673875968) se destaca en la tabla. Es un CROSS JOIN costoso. Decidimos tomar medidas.
Cancela una consulta costosa
En este ejemplo, encontramos una consulta que ejecutaba un CROSS JOIN costoso, por lo que decidimos cancelarla. 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, en el siguiente caso, la instrucción 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 haya cancelado la consulta.
En esta guía, 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 las operaciones costosas y diseñar el esquema adecuado para tus casos de uso. Para obtener más información sobre cómo crear instrucciones de SQL que se ejecuten de manera eficiente, consulta Prácticas recomendadas de SQL.
¿Qué sigue?
- Obtén más información sobre otras herramientas de introspección.
- Obtén información sobre qué otra información almacena Spanner 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 Spanner.