Estadísticas de DML particionado activo

El lenguaje de manipulación de datos (DML) particionado activo proporciona un progreso en tiempo real de las DML particionadas que están activas en tu base de datos.

Spanner proporciona una tabla integrada, SPANNER_SYS.ACTIVE_PARTITIONED_DMLS, que enumera las DML particionadas en ejecución y el progreso realizado en ellas.

En esta página, se describe la tabla en detalle, se muestran algunas consultas de ejemplo que usan esta tabla y, por último, se muestra cómo usar estas consultas para ayudar a mitigar los problemas causados por los DML particionados activos. La información de esta página se aplica a las bases de datos de dialecto de GoogleSQL y de dialecto de PostgreSQL.

Disponibilidad

Los datos de 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 con SPANNER_SYS.

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS muestra una lista de DML particionados activos ordenados por su hora de inicio.

Esquema de la tabla

A continuación, se muestra el esquema de la tabla SPANNER_SYS.ACTIVE_PARTITIONED_DMLS.

Nombre de la columna Tipo Descripción
TEXT STRING Es el texto de la sentencia de consulta de DML particionado.
TEXT_FINGERPRINT INT64 La huella digital es un hash del texto de DML particionado.
SESSION_ID STRING Es el ID de la sesión que ejecuta la DML particionada. Si borras el ID de la sesión, se cancelará la consulta.
NUM_PARTITIONS_TOTAL INT64 Es la cantidad total de particiones en la DML particionada.
NUM_PARTITIONS_COMPLETE INT64 Es la cantidad de particiones que completó el DML particionado.
NUM_TRIVIAL_PARTITIONS_COMPLETE INT64 Es la cantidad de particiones completas en las que no se procesaron filas.
PROGRESS DOUBLE El progreso de una DML particionada se calcula como la cantidad de particiones no triviales completadas dividida por la cantidad total de particiones no triviales.
ROWS_PROCESSED INT64 Es la cantidad de filas procesadas hasta el momento, que se actualiza después de que se completa cada partición.
START_TIMESTAMP TIMESTAMP Es un límite superior para la hora de inicio de un DML particionado.
LAST_UPDATE_TIMESTAMP TIMESTAMP Es la última marca de tiempo en la que la DML particionada avanzó. Se actualiza después de que se completa una partición.

Consultas de ejemplo

Puedes ejecutar los siguientes ejemplos de instrucciones SQL con las bibliotecas cliente, Google Cloud CLI o la consola de Google Cloud.

Cómo mostrar las consultas en ejecución más antiguas

La siguiente consulta muestra una lista de DML particionadas en ejecución, ordenadas por la hora de inicio de la consulta.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC;
texto session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete #googlecloudcertified rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024-01-21 15:56:30.498744-08:00 2024-01-22 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00.00% 0 2024-01-22 15:55:18.498744-08:00 22-01-2024 15:56:28.049799-08:00
DELETE from Singers WHERE SingerId > 1000000 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20.00% 238654 22-1-2024 15:56:30.498744-08:00 2024-01-22 15:56:19.049799-08:00
UPDATE Singers SET MarketingBudget = 1000 WHERE true 036097a9-91d4-566a-a399-20c754eabdc2 8 5 0 62.50% 238654 2024-01-22 15:57:47.498744-08:00 2024-01-22 15:57:39.049799-08:00

Limitaciones

El uso de la tabla SPANNER_SYS.ACTIVE_PARTITIONED_DMLS tiene las siguientes limitaciones:

  • Los resultados de PROGRESS, ROWS_PROCESSED y LAST_UPDATE_TIMESTAMP aumentan en los límites de partición completados para que la DML particionada pueda seguir actualizando filas mientras los valores de estos tres campos permanecen iguales.

  • Si hay millones de particiones en una DML particionada, es posible que el valor de la columna PROGRESS no capture todo el progreso incremental. Usa NUM_PARTITIONS_COMPLETE y NUM_TRIVIAL_PARTITIONS_COMPLETE para consultar el progreso con mayor nivel de detalle.

  • Si cancelas una DML particionada con una solicitud de RPC, es posible que la DML particionada cancelada siga apareciendo en la tabla. Si cancelas una DML particionada con la eliminación de sesiones, se quitará de la tabla de inmediato. Para obtener más información, consulta Cómo borrar el ID de sesión.

Usa datos de consultas de DML particionadas 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 qué se está ejecutando en el sistema. Por ejemplo, considera la situación en la que el uso de la CPU es alto y quieres responder las siguientes preguntas.

  • ¿Cuántas DML particionadas se están ejecutando en este momento?
  • ¿Qué son estos DML particionados?
  • ¿Cuántos de esos DML particionados se ejecutan durante mucho tiempo?
  • ¿Qué sesión ejecuta la consulta?

Si tienes 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.
  • Reduce la frecuencia de una DML particionada.

En la siguiente explicación, examinamos las DML particionadas activas y determinamos qué acción, si corresponde, se debe realizar.

Recupera un resumen de las DML particionadas activas

En nuestro ejemplo, notamos un uso de CPU superior al normal, por lo que decidimos ejecutar la siguiente consulta para mostrar el recuento de DML particionadas activas.

SELECT count(*) as active_count
FROM spanner_sys.active_partitioned_dmls;

La consulta muestra el siguiente resultado.

active_count
22

Muestra las 2 operaciones de DML particionadas más antiguas en ejecución

Luego, podemos ejecutar una consulta para obtener más información sobre las 2 DML particionadas en ejecución más antiguas, ordenadas por la hora de inicio de la DML particionada.

SELECT text,
       session_id,
       num_partitions_total,
       num_partitions_complete,
       num_trivial_partitions_complete,
       progress,
       rows_processed,
       start_timestamp,
       last_update_timestamp
FROM spanner_sys.active_partitioned_dmls
ORDER BY start_timestamp ASC LIMIT 2;
texto session_id num_partitions_total num_partitions_complete num_trivial_partitions_complete #googlecloudcertified rows_processed start_timestamp last_update_timestamp
UPDATE Concerts SET VenueId = \'amazing venue\' WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50.00% 2398654 2024-01-21 15:56:30.498744-08:00 2024-01-22 15:56:39.049799-08:00
UPDATE Singers SET LastName = NULL WHERE LastName = '' 0028284f-0190-52f9-b396-aa588e034806 8 4 4 00.00% 0 2024-01-22 15:55:18.498744-08:00 22-01-2024 15:56:28.049799-08:00

Cómo cancelar una consulta costosa

Encontramos un DML particionado que se ejecuta desde hace días y no avanza. Por lo tanto, podemos ejecutar el siguiente comando gcloud spanner databases sessions delete para borrar la sesión con el ID de sesión que cancela la DML particionada.

gcloud spanner databases sessions delete\
   5bd37a99-200c-5d2e-9021-15d0dbbd97e6 \
    --database=singer_db --instance=test-instance

¿Qué sigue?