El lenguaje de manipulación de datos (DML) particionado activo proporciona el progreso en tiempo real de los DML particionados que se encuentran activos actualmente en tu base de datos.
Spanner proporciona una tabla integrada, SPANNER_SYS.ACTIVE_PARTITIONED_DMLS
, que enumera los DML particionados en ejecución y el progreso que se realizó en ellos.
En este artículo, describiremos la tabla en detalle, mostraremos algunas consultas de ejemplo que usan esta tabla y, por último, demostraremos cómo usar estas consultas para mitigar los problemas causados por los DML particionados activos.
Disponibilidad
Los datos de 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 admiten 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 para SPANNER_SYS.ACTIVE_PARTITIONED_DMLS.
Nombre de la columna | Tipo | Descripción |
---|---|---|
TEXT |
STRING |
Texto de la declaración de consulta de DML particionada. |
TEXT_FINGERPRINT |
INT64 |
La huella digital es un hash del texto DML particionado. |
SESSION_ID |
STRING |
Es el ID de la sesión que ejecuta el DML particionado. Si borras el ID de sesión, se cancelará la consulta. |
NUM_PARTITIONS_TOTAL |
INT64 |
La cantidad total de particiones en el DML particionado. |
NUM_PARTITIONS_COMPLETE |
INT64 |
Es la cantidad de particiones que completó el DML particionado. |
NUM_TRIVIAL_PARTITIONS_COMPLETE |
INT64 |
La cantidad de particiones completas en las que no se procesaron filas. |
PROGRESS |
DOUBLE |
El progreso de un DML particionado se calcula como la cantidad de particiones no triviales completas dividida por la cantidad total de particiones no triviales. |
ROWS_PROCESSED |
INT64 |
La cantidad de filas procesadas hasta el momento, actualizadas después de que se complete cada partición. |
START_TIMESTAMP . |
TIMESTAMP |
Un límite superior en la hora de inicio de un DML particionado. |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
Última marca de tiempo del progreso del DML particionado Se actualiza después de que se completa una partición. |
Consultas de ejemplo
Puedes ejecutar las siguientes instrucciones de SQL de ejemplo con las bibliotecas cliente, Google Cloud CLI o Google Cloud Console.
Enumera las consultas en ejecución más antiguas
La siguiente consulta muestra una lista de DML particionados en ejecución ordenados 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 |
---|---|---|---|---|---|---|---|---|
ACTUALIZAR Conciertos SET VenueId = \"increíble lugar\" WHERE SingerId < 900000 | 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 | 27 | 15 | 3 | 50.00% | 2398654 | 2024-01-21 15:56:30.498744-08:00 | 22-01-2024 15:56:39.049799-08:00 |
UPDATE Singers SET LastName = NULL WHERE LastName = '' | 0028284f-0190-52f9-b396-aa588e034806 | 8 | 4 | 4 | 00% | 0 | 22-01-2024 15:55:18.498744-08:00 | 22-01-2024 15:56:28.049799-08:00 |
DELETE de Singers WHERE SingerId > 1000000 | 0071a85e-7e5c-576b-8a17-f9bc3d157eea | 8 | 4 | 3 | 20% | 238654 | 22-01-2024 15:56:30.498744-08:00 | 22-01-2024 15:56:19.049799-08:00 |
ACTUALIZAR cantantes SET MarketingBudget = 1000 WHERE true | 036097a9-91d4-566a-a399-20c754eabdc2 | 8 | 5 | 0 | 62,50% | 238654 | 22-01-2024 15:57:47.498744-08:00 | 22-01-2024 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
yLAST_UPDATE_TIMESTAMP
aumentan cuando se completan los límites de la partición, por lo que el DML particionado puede seguir actualizando las filas mientras los valores en estos tres campos permanecen iguales.Si hay millones de particiones en un DML particionado, es posible que el valor de la columna
PROGRESS
no capte todo el progreso incremental. UsaNUM_PARTITIONS_COMPLETE
yNUM_TRIVIAL_PARTITIONS_COMPLETE
para referirte a un progreso con mayor nivel de detalle.Si cancelas un DML particionado mediante una solicitud de RPC, es posible que el DML particionado cancelado aún aparezca en la tabla. Si cancelas un DML particionado mediante la eliminación de la sesión, se quitará de la tabla de inmediato. Para obtener más información, consulta Borra el ID de sesión.
Usa datos de consultas de DML particionadas activas para solucionar problemas de uso de CPU elevado
Las estadísticas de consulta 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 ejecuta en el sistema. Por ejemplo, considera la situación en la que el uso de CPU es alto y deseas responder las siguientes preguntas.
- ¿Cuántos DML particionados se están ejecutando en este momento?
- ¿Qué son estos DML particionados?
- ¿Cuántos de esos DML particionados se están ejecutando durante mucho tiempo?
- ¿Qué sesión ejecuta la consulta?
Si tienes respuestas a las preguntas anteriores, puedes decidir realizar la siguiente acción.
- Borra la sesión que ejecuta la consulta para obtener una resolución inmediata.
- Reduce la frecuencia de un DML particionado.
En la siguiente explicación, examinaremos los DML particionados activos y determinaremos qué acción, si corresponde, tomar.
Recuperar un resumen de los DML particionados activos
En nuestra situación de ejemplo, notamos un uso de CPU más alto de lo normal, por lo que decidimos ejecutar la siguiente consulta para mostrar el recuento de DML particionados activos.
SELECT count(*) as active_count
FROM spanner_sys.active_partitioned_dmls;
La consulta muestra el siguiente resultado.
active_count |
---|
22 |
Obtén una lista de los 2 DML particionados en ejecución más antiguos
Luego, podemos ejecutar una consulta para obtener más información sobre los 2 DML particionados más antiguos en ejecución ordenados por la hora de inicio del DML particionado.
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 |
---|---|---|---|---|---|---|---|---|
ACTUALIZAR Conciertos SET VenueId = \"increíble lugar\" WHERE SingerId < 900000 | 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 | 27 | 15 | 3 | 50.00% | 2398654 | 2024-01-21 15:56:30.498744-08:00 | 22-01-2024 15:56:39.049799-08:00 |
UPDATE Singers SET LastName = NULL WHERE LastName = '' | 0028284f-0190-52f9-b396-aa588e034806 | 8 | 4 | 4 | 00% | 0 | 22-01-2024 15:55:18.498744-08:00 | 22-01-2024 15:56:28.049799-08:00 |
Cancela una consulta costosa
Encontramos un DML particionado que se ejecuta por días y no está progresando. 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 el DML particionado.
gcloud spanner databases sessions delete\
5bd37a99-200c-5d2e-9021-15d0dbbd97e6 \
--database=singer_db --instance=test-instance
¿Qué sigue?
- Obtén más información sobre otras herramientas de introspección.
- Obtén más información sobre otra información que 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 Spanner.