Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
O Spanner fornece tabelas integradas que registram as estatísticas de operações de leitura (ou consulta),
gravação e exclusão das suas tabelas (incluindo tabelas de
fluxos de alterações) e índices. Com as estatísticas de operações de tabela, é possível fazer o seguinte:
Identifique tabelas com aumento no tráfego de gravação correspondente ao aumento no armazenamento.
Identifique tabelas com tráfego inesperado de leitura, gravação e exclusão.
Identifique as tabelas mais usadas.
Quando você consulta ou grava em uma tabela, a contagem de operações correspondente para a
tabela aumenta em 1, independente 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 do System Insights.
Acessar estatísticas de operações de tabela
O Spanner fornece as estatísticas de operações de tabela no esquema SPANNER_SYS.É possível usar as seguintes maneiras para acessar os dados de SPANNER_SYS:
A página do Spanner Studio de um banco de dados no console Google Cloud .
Os seguintes métodos de leitura única fornecidos pelo Spanner
não são compatíveis com SPANNER_SYS:
realizar uma leitura forte de uma única linha ou de várias linhas em uma tabela;
realizar uma leitura desatualizada de uma única linha ou várias linhas em uma tabela;
ler uma única linha ou várias linhas em um índice secundário.
Estatísticas de 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 em 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 específica.
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 da tabela 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 que gravam 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
será incrementado 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
Nesta seção, há várias instruções SQL de exemplo que recuperam estatísticas agregadas de operações de tabela. É possível executar essas instruções SQL usando as bibliotecas de cliente ou o gcloud spanner.
Consulte 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;
Consulte as tabelas e os índices com o maior número de 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;
Consulte as tabelas e os índices com mais operações de leitura e consulta 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
GoogleSQL
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 um índice existente no banco de dados.
PostgreSQL
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 um í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 existente no banco de dados.
PostgreSQL
SELECT interval_end,
read_query_count,
write_count,
delete_count
FROM spanner_sys.table_operations_stats_hour
WHERE interval_end > spanner.timestamptz_subtract(now(), '14 DAY')
AND table_name = 'table_name'
ORDER BY interval_end DESC;
Em que:
table_name precisa ser uma tabela ou um índice existente 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));
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-08-11 UTC."],[],[],null,["# Table operations statistics\n\nSpanner provides built-in tables that records the read (or query),\nwrite, and delete operations statistics for your tables (including change\nstreams tables) and indexes. With table operations statistics you can do the\nfollowing:\n\n- Identify tables with increased write traffic corresponding\n to storage increase.\n\n- Identify tables with unexpected read, write, and delete traffic.\n\n- Identify heavily-used tables.\n\nWhen you query or write to a table, the corresponding operation count for the\ntable increments by 1, regardless of the number of rows accessed.\n\nOverall operations-per-second metrics of a database can be monitored with\n`Operations per second`, `Operations per second by API method`, and other\nrelated metrics in your [System Insights](/spanner/docs/monitoring-console)\ncharts.\n| **Note:** The sum of the operation counts on all tables and indexes might not be equal to the total operations on a database. For example, one write to a table increments the `write_count` on the table and on all indexes on the table. However, the write only counts as one operation on the database. The operation counts don't depend on the number of rows read or written to. They track the number of operations only. When the PartitionRead or PartitionQuery API returns multiple partition tokens, each Read or ExecuteSql call with a different token counts as a separate table operation.\n\nAccess table operations statistics\n----------------------------------\n\nSpanner provides the table operations statistics in the\n`SPANNER_SYS` schema.You can use the following ways to access `SPANNER_SYS` data:\n\n- A database's Spanner Studio page in the Google Cloud console.\n\n- The `gcloud spanner databases execute-sql` command.\n\n- The [`executeSql`](/spanner/docs/reference/rest/v1/projects.instances.databases.sessions/executeSql)\n or the [`executeStreamingSql`](/spanner/docs/reference/rest/v1/projects.instances.databases.sessions/executeStreamingSql)\n method.\n\nThe following single read methods that Spanner provides\ndon't support `SPANNER_SYS`:\n\n- Performing a strong read from a single row or multiple rows in a table.\n- Performing a stale read from a single row or multiple rows in a table.\n- Reading from a single row or multiple rows in a secondary index.\n\nTable operations statistics\n---------------------------\n\nThe following tables track the read (or query), write, and delete statistics on your\ntables and indexes during a specific time period:\n\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE`: Operations during 1 minute intervals\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE`: Operations during 10 minute intervals\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR`: Operations during 1 hour intervals\n\nThese tables have the following properties:\n\n- Each table contains data for non-overlapping time intervals of the length that\n the table name specifies.\n\n- Intervals are based on clock times. 1 minute intervals start on the minute, 10\n minute intervals start every 10 minutes starting on the hour, and 1 hour\n intervals start on the hour.\n\n For example, at 11:59:30 AM, the most recent intervals available to SQL\n queries are:\n - **1 minute**: 11:58:00--11:58:59 AM\n - **10 minute**: 11:40:00--11:49:59 AM\n - **1 hour**: 10:00:00--10:59:59 AM\n\n### Schema for all table operations statistics tables\n\nIf you insert data into your database using mutations, the `write_count`\nincrements by 1 for each table accessed by the insert statement. In addition,\na query that accesses an index, without scanning the underlying table, only\nincrements the `read_query_count` on the index.\n\nData retention\n--------------\n\nAt a minimum, Spanner keeps data for each table for the following\ntime periods:\n\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_MINUTE`: Intervals covering the previous 6\n hours.\n\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_10MINUTE`: Intervals covering the previous\n 4 days.\n\n- `SPANNER_SYS.TABLE_OPERATIONS_STATS_HOUR`: Intervals covering the previous 30\n days.\n\n| **Note:** You cannot prevent Spanner from collecting table operations statistics. To delete the data in these tables, you must delete the database associated with the tables or wait until Spanner removes the data automatically.\n\n### Example queries\n\nThis section includes several example SQL statements that retrieve aggregate\ntable operations statistics. You can run these SQL statements using the\n[client libraries](/spanner/docs/reference/libraries), or the\n[gcloud spanner](/spanner/docs/gcloud-spanner#execute_sql_statements).\n\n#### Query the tables and indexes with the most write operations for the most recent interval\n\n```\n SELECT interval_end,\n table_name,\n write_count\n FROM spanner_sys.table_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.table_operations_stats_minute)\n ORDER BY write_count DESC;\n \n```\n\n#### Query the tables and indexes with the most delete operations for the most recent interval\n\n```\n SELECT interval_end,\n table_name,\n delete_count\n FROM spanner_sys.table_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.table_operations_stats_minute)\n ORDER BY delete_count DESC;\n \n```\n\n#### Query the tables and indexes with the most read and query operations for the most recent interval\n\n```\n SELECT interval_end,\n table_name,\n read_query_count\n FROM spanner_sys.table_operations_stats_minute\n WHERE interval_end = (\n SELECT MAX(interval_end)\n FROM spanner_sys.table_operations_stats_minute)\n ORDER BY read_query_count DESC;\n \n```\n\n#### Query the usage of a table over the last 6 hours\n\n### GoogleSQL\n\n```\n SELECT interval_end,\n read_query_count,\n write_count,\n delete_count\n FROM spanner_sys.table_operations_stats_minute\n WHERE table_name = \"table_name\"\n ORDER BY interval_end DESC;\n \n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n\n### PostgreSQL\n\n```\n SELECT interval_end,\n read_query_count,\n write_count,\n delete_count\n FROM spanner_sys.table_operations_stats_minute\n WHERE table_name = 'table_name'\n ORDER BY interval_end DESC;\n \n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n\n#### Query the usage of a table over the last 14 days\n\n### GoogleSQL\n\n```\nSELECT interval_end,\n read_query_count,\n write_count,\n delete_count\nFROM spanner_sys.table_operations_stats_hour\nWHERE interval_end \u003e TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -14 DAY)\n AND table_name = \"table_name\"\nORDER BY interval_end DESC;\n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n\n### PostgreSQL\n\n```\nSELECT interval_end,\n read_query_count,\n write_count,\n delete_count\nFROM spanner_sys.table_operations_stats_hour\nWHERE interval_end \u003e spanner.timestamptz_subtract(now(), '14 DAY')\n AND table_name = 'table_name'\nORDER BY interval_end DESC;\n```\n\nWhere:\n\n- \u003cvar translate=\"no\"\u003e\u003ccode translate=\"no\" dir=\"ltr\"\u003etable_name\u003c/code\u003e\u003c/var\u003e must be an existing table or index in the database.\n\n#### Query the tables and indexes with no usage in the last 24 hours\n\n### GoogleSQL\n\n```\n(SELECT t.table_name\n FROM information_schema.tables AS t\n WHERE t.table_catalog = \"\"\n AND t.table_schema = \"\"\n AND t.table_type = \"BASE TABLE\"\n UNION ALL\n SELECT cs.change_stream_name\n FROM information_schema.change_streams cs\n WHERE cs.change_stream_catalog = \"\"\n AND cs.change_stream_schema = \"\"\n UNION ALL\n SELECT idx.index_name\n FROM information_schema.indexes idx\n WHERE idx.index_type = \"INDEX\"\n AND idx.table_catalog = \"\"\n AND idx.table_schema = \"\")\n EXCEPT ALL\n(SELECT DISTINCT(table_name)\n FROM spanner_sys.table_operations_stats_hour\n WHERE interval_end \u003e TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -24 HOUR));\n```\n\nWhat's next\n-----------\n\n- Use [Table sizes statistics](/spanner/docs/introspection/table-sizes-statistics)\n to determine the sizes of your tables and indexes.\n\n- Learn about other [Introspection tools](/spanner/docs/introspection).\n\n- Learn more about [SQL best practices](/spanner/docs/sql-best-practices) for\n Spanner."]]