Estatísticas das operações de tabela

O Spanner fornece tabelas integradas que registram as estatísticas de operações de leitura (ou consulta), gravação e exclusão das tabelas (incluindo tabelas de fluxos de mudanças) e índices. Com as estatísticas de operações de tabela, é possível fazer o seguinte:

  • Identifique tabelas com aumento do tráfego de gravação correspondente ao aumento do armazenamento.

  • Identifique tabelas com tráfego de leitura, gravação e exclusão inesperado.

  • Identifique as tabelas mais usadas.

Quando você consulta ou grava em uma tabela, a contagem de operações correspondentes para a tabela aumenta em 1, independentemente do número de linhas acessadas.

As métricas gerais de operações por segundo de um banco de dados podem ser monitoradas com Operations per second, Operations per second by API method e outras métricas relacionadas nos gráficos Insights do sistema.

Disponibilidade

O Spanner fornece as estatísticas de operações de tabela no esquema SPANNER_SYS. Os dados de SPANNER_SYS estão disponíveis apenas por interfaces SQL. Exemplo:

  • Página do Spanner Studio de um banco de dados no console do Google Cloud

  • O comando gcloud spanner databases execute-sql

  • A API executeQuery

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

Estatísticas das operações de tabela

As tabelas a seguir rastreiam as estatísticas de leitura (ou consulta), gravação e exclusão nas suas tabelas e índices durante um período específico:

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE: operações durante intervalos de 1 minuto
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE: operações durante intervalos de 10 minutos
  • SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR: operações durante intervalos de 1 hora

Essas tabelas têm as seguintes propriedades:

  • Cada uma contém dados para intervalos de tempo não sobrepostos do comprimento que o nome da tabela especifica.

  • Os intervalos são baseados em horas. Os intervalos de 1 minuto começam no minuto, os de 10 minutos começam a cada 10 minutos, começando na hora, e os intervalos de 1 hora começam na hora.

    Por exemplo, às 11:59:30, os intervalos mais recentes disponíveis para as consultas SQL são:

    • 1 minuto: 11:58:00–11:58:59
    • 10 minutos: 11:40:00–11:49:59
    • 1 hora: 10:00:00–10:59:59

Esquema para todas as tabelas de estatísticas de operações de tabela

Nome da coluna Tipo Descrição
INTERVAL_END TIMESTAMP Fim do intervalo de tempo em que os tamanhos das tabelas foram coletados.
TABLE_NAME STRING Nome da tabela ou do índice.
READ_QUERY_COUNT INT64 Número de consultas ou leituras da tabela.
WRITE_COUNT INT64 Número de consultas gravadas na tabela.
DELETE_COUNT INT64 Número de consultas que executam exclusões na tabela.

Se você inserir dados no banco de dados usando mutações, o write_count vai aumentar em 1 para cada tabela acessada pela instrução de inserção. Além disso, uma consulta que acessa um índice, sem verificar a tabela subjacente, só incrementa o read_query_count no índice.

Retenção de dados

O Spanner mantém dados para cada tabela, no mínimo, pelos períodos a seguir:

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE: intervalos que abrangem as seis horas anteriores.

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE: intervalos que abrangem os quatro dias anteriores.

  • SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR: intervalos que abrangem os últimos 30 dias.

Exemplo de consultas

Esta seção inclui vários exemplos de instruções SQL que recuperam estatísticas agregadas das operações de tabela. É possível executar essas instruções SQL usando as bibliotecas de cliente ou o gcloud spanner.

Consultar as tabelas e os índices com mais operações de gravação no intervalo mais recente

    SELECT interval_end,
          table_name,
          write_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY write_count DESC;
  

Consultar as tabelas e os índices com mais operações de exclusão no intervalo mais recente

    SELECT interval_end,
          table_name,
          delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY delete_count DESC;
  

Consultar as tabelas e os índices com as operações de leitura e consulta mais frequentes no intervalo mais recente

    SELECT interval_end,
          table_name,
          read_query_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE interval_end = (
          SELECT MAX(interval_end)
          FROM spanner_sys.table_operations_stats_minute)
    ORDER BY read_query_count DESC;
  

Consultar o uso de uma tabela nas últimas 6 horas

    SELECT interval_end,
           read_query_count,
           write_count,
           delete_count
    FROM spanner_sys.table_operations_stats_minute
    WHERE table_name = table_name
    ORDER BY interval_end DESC;
    

Em que:

  • table_name precisa ser uma tabela ou índice existente no banco de dados.

Consultar o uso de uma tabela nos últimos 14 dias

GoogleSQL

SELECT interval_end,
       read_query_count,
       write_count,
       delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)
      AND table_name = table_name
ORDER BY interval_end DESC;

Em que:

  • table_name precisa ser uma tabela ou um índice no banco de dados.

Consultar as tabelas e os índices sem uso nas últimas 24 horas

GoogleSQL

(SELECT t.table_name
 FROM  information_schema.tables AS t
 WHERE t.table_catalog = ""
   AND t.table_schema = ""
   AND t.table_type = "BASE TABLE"
 UNION ALL
 SELECT cs.change_stream_name
 FROM information_schema.change_streams cs
 WHERE cs.change_stream_catalog = ""
   AND cs.change_stream_schema = ""
 UNION ALL
 SELECT idx.index_name
 FROM information_schema.indexes idx
 WHERE idx.index_type = "INDEX"
   AND idx.table_catalog = ""
   AND idx.table_schema = "")
 EXCEPT ALL
(SELECT  DISTINCT(table_name)
 FROM spanner_sys.table_operations_stats_hour
 WHERE interval_end > TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR));

A seguir