Estatísticas de DMLs particionadas ativas

A linguagem de manipulação de dados (DML) particionada ativa fornece o progresso em tempo real das DMLs particionadas que estão ativas na sua base de dados.

O Spanner fornece uma tabela incorporada, SPANNER_SYS.ACTIVE_PARTITIONED_DMLS, que apresenta as DMLs particionadas em execução e o progresso feito nas mesmas.

Esta página descreve a tabela detalhadamente, mostra alguns exemplos de consultas que usam esta tabela e, por fim, demonstra como usar estas consultas para ajudar a mitigar problemas causados por DMLs particionados ativos. As informações nesta página aplicam-se a bases de dados com o dialeto GoogleSQL e bases de dados com o dialeto PostgreSQL.

Aceda a estatísticas de DML particionadas ativas

O Spanner fornece as estatísticas de DML particionadas ativas no esquema SPANNER_SYS. Pode usar as seguintes formas para aceder aos dados do SPANNER_SYS:

Os seguintes métodos de leitura única fornecidos pelo Spanner não suportam o SPANNER_SYS:

  • Executar uma leitura forte a partir de uma única linha ou de várias linhas numa tabela.
  • Executar uma leitura desatualizada de uma única linha ou várias linhas numa tabela.
  • Leitura de uma única linha ou várias linhas num índice secundário.

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS devolve uma lista de DMLs particionadas ativas ordenadas pela respetiva hora de início.

Esquema da tabela

A tabela seguinte mostra o esquema da tabela SPANNER_SYS.ACTIVE_PARTITIONED_DMLS.

Nome da coluna Tipo Descrição
TEXT STRING O texto da declaração de consulta DML particionada.
TEXT_FINGERPRINT INT64 A impressão digital é um hash do texto DML particionado.
SESSION_ID STRING O ID da sessão que está a executar o DML particionado. A eliminação do ID da sessão cancela a consulta.
NUM_PARTITIONS_TOTAL INT64 O número total de partições na DML particionada.
NUM_PARTITIONS_COMPLETE INT64 O número de partições que o DML particionado concluiu.
NUM_TRIVIAL_PARTITIONS_COMPLETE INT64 O número de partições completas em que não foram processadas linhas.
PROGRESS DOUBLE O progresso de uma DML particionada é calculado como o número de partições não triviais concluídas dividido pelo número total de partições não triviais.
ROWS_PROCESSED INT64 O número de linhas processadas até agora, atualizado após a conclusão de cada partição.
START_TIMESTAMP. TIMESTAMP Um limite superior para a hora de início de um DML particionado.
LAST_UPDATE_TIMESTAMP TIMESTAMP Data/hora da última vez que a DML particionada progrediu. Atualizado após a conclusão de uma partição.

Consultas de exemplo

Pode executar as seguintes declarações SQL de exemplo através das bibliotecas de cliente, da Google Cloud CLI ou da Google Cloud consola.

Apresentar as consultas em execução mais antigas

A consulta seguinte devolve uma lista de DMLs particionados em execução ordenados pela hora de início da 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 progresso 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 2024-01-22 15:56:28.049799-08:00
DELETE from Singers WHERE SingerId > 1000000 0071a85e-7e5c-576b-8a17-f9bc3d157eea 8 4 3 20,00% 238654 2024-01-22 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

Limitações

A utilização da tabela SPANNER_SYS.ACTIVE_PARTITIONED_DMLS tem as seguintes limitações:

  • Os resultados de PROGRESS, ROWS_PROCESSED e LAST_UPDATE_TIMESTAMP são incrementados nos limites das partições concluídas, pelo que a DML particionada pode continuar a atualizar linhas enquanto os valores nestes três campos permanecem iguais.

  • Se existirem milhões de partições num DML particionado, o valor na coluna PROGRESS pode não captar todo o progresso incremental. Use NUM_PARTITIONS_COMPLETE e NUM_TRIVIAL_PARTITIONS_COMPLETE para consultar o progresso com maior detalhe.

  • Se cancelar um DML particionado através de um pedido RPC, o DML particionado cancelado pode continuar a aparecer na tabela. Se cancelar um DML particionado através da eliminação da sessão, este é removido imediatamente da tabela. Para mais informações, consulte o artigo Eliminar o ID da sessão.

Use dados de consultas DML particionadas ativas para resolver problemas de utilização elevada da CPU

As estatísticas de consultas e as estatísticas de transações fornecem informações úteis quando resolve problemas de latência numa base de dados do Spanner. Estas ferramentas fornecem informações sobre as consultas que já foram concluídas. No entanto, por vezes, é necessário saber o que está a ser executado no sistema. Por exemplo, considere o cenário em que a utilização da CPU é elevada e quer responder às seguintes perguntas.

  • Quantas DMLs particionadas estão a ser executadas neste momento?
  • O que são estas DMLs particionadas?
  • Quantas dessas DMLs particionadas estão em execução durante muito tempo?
  • Que sessão está a executar a consulta?

Se tiver respostas para as perguntas anteriores, pode decidir tomar a seguinte ação.

  • Eliminar a sessão que executa a consulta para uma resolução imediata.
  • Reduza a frequência de uma DML particionada.

No seguinte passo a passo, examinamos os DMLs particionados ativos e determinamos que ação, se aplicável, tomar.

Recupere um resumo das DMLs particionadas ativas

No nosso cenário de exemplo, verificamos uma utilização da CPU superior ao normal, pelo que decidimos executar a seguinte consulta para devolver a contagem de DMLs particionados ativos.

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

A consulta produz o seguinte resultado.

active_count
22

Apresentar as 2 DMLs particionadas em execução mais antigas

Em seguida, podemos executar uma consulta para encontrar mais informações sobre os 2 DMLs particionados mais antigos em execução, ordenados pela hora de início do 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 progresso 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 2024-01-22 15:56:28.049799-08:00

Cancele uma consulta dispendiosa

Encontrámos um DML particionado que está em execução há dias e não está a fazer progressos. Por conseguinte, podemos executar o seguinte comando gcloud spanner databases sessions delete para eliminar a sessão através do ID da sessão, o que cancela o DML particionado.

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

O que se segue?