Estatísticas de DMLs particionadas ativas

A Linguagem de manipulação de dados (DML, na sigla em inglês) particionada ativa oferece progresso em tempo real para as DMLs particionadas atualmente ativas no banco de dados.

O Spanner fornece uma tabela integrada, SPANNER_SYS.ACTIVE_PARTITIONED_DMLS, que lista DMLs particionadas em execução e o progresso feito nelas.

Neste artigo, descreveremos a tabela em detalhes, mostraremos alguns exemplos de consultas que usam essa tabela e, por fim, demonstraremos como usar essas consultas para ajudar a atenuar problemas causados por DMLs particionadas ativas.

Disponibilidade

Os dados de SPANNER_SYS estão disponíveis somente por meio de interfaces SQL, por exemplo:

Outros métodos de leitura única fornecidos pelo Spanner não são compatíveis com SPANNER_SYS.

ACTIVE_PARTITIONED_DMLS

SPANNER_SYS.ACTIVE_PARTITIONED_DMLS retorna uma lista de DMLs particionadas ativas classificadas pelo horário de início.

Esquema de tabela

Veja a seguir o esquema da tabela de SPANNER_SYS.ACTIVE_PARTITIONED_DMLS.

Nome da coluna Tipo Descrição
TEXT STRING O texto da instrução da 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á executando a DML particionada. A exclusão do ID da sessão cancelará 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 concluídas pela DML particionada.
NUM_TRIVIAL_PARTITIONS_COMPLETE INT64 O número de partições completas em que nenhuma linha foi processada.
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é o momento, atualizado após cada partição ser concluída.
START_TIMESTAMP. TIMESTAMP Um limite superior no horário de início de uma DML particionada.
LAST_UPDATE_TIMESTAMP TIMESTAMP Último carimbo de data/hora em que a DML particionada fez progresso. Atualizado após a conclusão de uma partição.

Exemplo de consultas

É possível executar as instruções SQL de exemplo a seguir usando as bibliotecas de cliente, a Google Cloud CLI ou o Console do Google Cloud.

Como listar consultas em execução mais antigas

A consulta a seguir retorna uma lista de DMLs particionadas em execução, classificadas pelo horário 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 para indicar seu progresso rows_processed start_timestamp last_update_timestamp
ATUALIZAR shows SET VenueId = \"local incrível\" WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50% 2398654 21-01-2024 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,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,00% 238654 22-01-2024 15:56:30.498744-08:00 22-01-2024 15:56:19.049799-08:00
UPDATE Singers 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

Limitações

O uso da tabela SPANNER_SYS.ACTIVE_PARTITIONED_DMLS tem as seguintes limitações:

  • Os resultados PROGRESS, ROWS_PROCESSED e LAST_UPDATE_TIMESTAMP são incrementados nos limites de partição completos para que a DML particionada continue atualizando as linhas enquanto os valores nesses três campos permanecem os mesmos.

  • Se houver milhões de partições em uma DML particionada, o valor na coluna PROGRESS poderá não capturar todo o progresso incremental. Use NUM_PARTITIONS_COMPLETE e NUM_TRIVIAL_PARTITIONS_COMPLETE para indicar um progresso de granularidade mais refinada.

  • Se você cancelar uma DML particionada usando uma solicitação de RPC, talvez a DML particionada cancelada ainda apareça na tabela. Se você cancelar uma DML particionada usando a exclusão de sessão, ela será removida da tabela imediatamente. Para saber mais, consulte Como excluir o ID da sessão.

Use dados de consultas de DML particionadas ativas para solucionar problemas de alta utilização da CPU

As estatísticas de consulta e de transação fornecem informações úteis para solucionar problemas de latência em um banco de dados do Spanner. Essas ferramentas fornecem informações sobre as consultas que já foram concluídas. No entanto, às vezes é necessário saber o que está sendo executado no sistema. Por exemplo, considere um cenário em que a utilização da CPU é alta e você quer responder às perguntas a seguir.

  • Quantas DMLs particionadas estão em execução no momento?
  • O que são DMLs particionadas?
  • Quantas dessas DMLs particionadas estão em execução há muito tempo?
  • Qual sessão está executando a consulta?

Se você tem respostas para as perguntas anteriores, pode decidir tomar a medida a seguir.

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

No tutorial a seguir, vamos examinar as DMLs particionadas ativas e determinar qual ação será realizada, se houver.

Recuperar um resumo das DMLs particionadas ativas

Em nosso cenário de exemplo, notamos um uso maior do que o normal da CPU. Por isso, decidimos executar a consulta a seguir para retornar a contagem de DMLs particionadas ativas.

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

A consulta gera o resultado a seguir.

active_count
22

Como listar as duas DMLs particionadas mais antigas em execução

Em seguida, podemos executar uma consulta para encontrar mais informações sobre as duas DMLs particionadas mais antigas em execução classificadas pelo horário de início da 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 para indicar seu progresso rows_processed start_timestamp last_update_timestamp
ATUALIZAR shows SET VenueId = \"local incrível\" WHERE SingerId < 900000 5bd37a99-200c-5d2e-9021-15d0dbbd97e6 27 15 3 50% 2398654 21-01-2024 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,00% 0 22-01-2024 15:55:18.498744-08:00 22-01-2024 15:56:28.049799-08:00

Cancelar uma consulta cara

Encontramos uma DML particionada que está em execução há dias e não está progredindo. Portanto, podemos executar o seguinte comando gcloud spanner databases sessions delete para excluir a sessão usando o ID da sessão, que cancela a DML particionada.

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

A seguir