A partir da versão V1.3, o Hologres disponibiliza a visualize de sistema hologres.hg_table_info para coletar estatísticas diárias sobre as tabelas da sua instância. Consulte essa visualize para monitorar e analisar informações das tabelas e adotar medidas de otimização com base nas estatísticas obtidas.
Limitações
Este recurso está disponível apenas no Hologres V1.3 e versões posteriores. Caso sua instância esteja em uma versão anterior, será necessário atualizá-la. Para obter assistência, consulte Erros comuns de preparação para atualização ou participe do grupo do DingTalk do Hologres. Para mais informações, veja Como obter mais suporte online?.
Os dados na visualize hologres.hg_table_info possuem atualização T+1. As informações de um determinado dia geralmente são atualizadas até as 05:00 do dia seguinte. No dia em que uma instância do Hologres é atualizada para a V1.3, nenhuma estatística de tabela é gerada. Uma consulta nesse dia retorna o erro
meta warehouse store currently not available. É possível começar a consultar as estatísticas das tabelas no dia posterior à atualização.
Observações de uso
Por padrão, as estatísticas das tabelas são retidas por 30 dias.
Para tabelas internas não particionadas (
type='TABLE'), é possível consultar estatísticas detalhadas, como espaço de armazenamento, quantidade de arquivos, contagens acumuladas de acesso e número de linhas.Em outros objetos, como views, materialized views, foreign tables e tabelas pai particionadas, apenas informações básicas estão disponíveis. Isso inclui o número de partições, o nome da tabela externa mapeada por uma foreign table e as definições de views e materialized views.
A tabela hologres.hg_table_info pertence ao sistema de meta warehouse do Hologres. Como uma falha na consulta à hologres.hg_table_info não afeta as consultas de negócio executadas na instância, a estabilidade da tabela hologres.hg_table_info não é coberta pelo acordo de nível de serviço (SLA) do produto.
Visualize hg_table_info
A visualize hg_table_info contém os seguintes campos.
As estatísticas das tabelas ficam armazenadas na visualize de sistema hologres.hg_table_info. Após a atualização de uma instância para a V1.3, as informações das tabelas passam a ser coletadas diariamente por padrão.
Alguns campos podem estar nulos para tabelas criadas antes da atualização da instância para a V1.3, pois suas informações de criação não foram coletadas. Já para tabelas criadas após a atualização, todos os campos são preenchidos.
Campo | Tipo | Descrição | Observações |
db_name | text | Nome do banco de dados onde a tabela reside. | Nenhuma |
schema_name | text | Nome do schema onde a tabela reside. | Nenhuma |
table_name | text | Nome da tabela. | Nenhuma |
table_id | text | Identificador único da tabela. Para uma foreign table, o formato do ID é | Nenhuma |
type | text | Tipo do objeto. Valores válidos:
|
|
partition_spec | text | Condição de particionamento. Este campo é válido apenas para tabelas filhas particionadas. | Nenhuma |
is_partition | boolean | Indica se a tabela é uma tabela filha particionada. | Nenhuma |
owner_name | text | Nome de usuário do proprietário da tabela. É possível associar esta coluna à coluna | Nenhuma |
create_time | timestamp with time zone | Timestamp de criação da tabela. | Nenhuma |
last_ddl_time | timestamp with time zone | Timestamp da última atualização dos metadados da tabela. | Nenhuma |
last_modify_time | timestamp with time zone | Timestamp da última modificação dos dados da tabela. | Nenhuma |
last_access_time | timestamp with time zone | Timestamp do último acesso à tabela. | Nenhuma |
view_def | text | Definição da visualize. | Campo válido apenas para visualizes. |
comment | text | Descrição da tabela ou visualize. | Nenhuma |
hot_storage_size | bigint | Tamanho do hot storage utilizado pela tabela, em bytes. | O tamanho de armazenamento reportado em |
cold_storage_size | bigint | Tamanho do cold storage utilizado pela tabela, em bytes. | O tamanho de armazenamento reportado em |
hot_file_count | bigint | Quantidade de arquivos no hot storage da tabela. | Nenhuma |
cold_file_count | bigint | Quantidade de arquivos no cold storage da tabela. | Nenhuma |
table_meta | jsonb | Metadados brutos da tabela, no formato JSONB. | Nenhuma |
row_count | bigint | Número de linhas na tabela ou partição. | Para uma tabela pai particionada, este valor representa o total de linhas somando todas as suas tabelas filhas. |
collect_time | timestamp with time zone | Timestamp em que as estatísticas foram coletadas. | Nenhuma |
partition_count | bigint | Quantidade de tabelas filhas particionadas. | Campo válido apenas para tabelas pai particionadas. |
parent_schema_name | text | Nome do schema da tabela pai correspondente a uma tabela filha particionada. | Campo válido apenas para tabelas filhas particionadas. |
parent_table_name | text | Nome da tabela pai correspondente a uma tabela filha particionada. | Campo válido apenas para tabelas filhas particionadas. |
total_read_count | bigint | Número acumulado de operações de leitura na tabela. Trata-se de um valor aproximado, já que operações | Valor aproximado; não recomendado para contagens precisas. |
total_write_count | bigint | Número acumulado de operações de escrita na tabela. Trata-se de um valor aproximado, já que operações | Valor aproximado; não recomendado para contagens precisas. |
read_sql_count_1d | bigint | Total de operações de leitura na tabela no dia anterior (T-1), entre 00:00 e 24:00 (UTC+8). |
|
write_sql_count_1d | bigint | Total de operações de escrita na tabela no dia anterior (T-1), entre 00:00 e 24:00 (UTC+8). |
|
Conceder permissões
É necessário ter permissões específicas para consultar estatísticas de tabelas. Esta seção descreve as regras de permissão e como concedê-las.
-
Visualizar estatísticas de tabelas de todos os bancos de dados em uma instância do Hologres
-
Conceda privilégios de superusuário ao usuário.
Um superusuário consegue visualizar estatísticas de tabelas de todos os bancos de dados em uma instância do Hologres. O comando abaixo concede privilégios de superusuário.
-- Replace "Alibaba Cloud account ID" with the actual username. For a RAM user, prefix the ID with "p4_". ALTER USER "Alibaba Cloud account ID" SUPERUSER; -
Adicione usuários ao grupo de usuários
pg_stat_scan_table.Além do superusuário, o Hologres permite que usuários do grupo
pg_stat_scan_tables(para versões anteriores à V1.3.44) ou do grupopg_read_all_stats(para V1.3.44 e posteriores) visualizem logs de estatísticas de todas as tabelas do banco de dados. Se um usuário comum precisar visualizar todos os logs, ele deve solicitar a um superusuário que o adicione ao grupo relevante. O comando de autorização é o seguinte.-- For versions earlier than V1.3.44 GRANT pg_stat_scan_tables TO "Alibaba Cloud account ID";-- For the expert permission model CALL spm_grant('pg_stat_scan_tables', 'Alibaba Cloud account ID'); -- For the simple permission model (SPM) CALL slpm_grant('pg_stat_scan_tables', 'Alibaba Cloud account ID'); -- For the schema-level permission model (SLPM) -- For V1.3.44 and later GRANT pg_read_all_stats TO "Alibaba Cloud account ID";-- For the expert permission model CALL spm_grant('pg_read_all_stats', 'Alibaba Cloud account ID'); -- For the simple permission model (SPM) CALL slpm_grant('pg_read_all_stats', 'Alibaba Cloud account ID'); -- For the schema-level permission model (SLPM)
-
-
Visualizar estatísticas de tabelas do banco de dados atual
Ao ativar o modelo de permissão simples (SPM) ou o modelo de permissão no nível de schema (SLPM) e adicionar um usuário ao grupo
db_admin, a funçãodb_adminpoderá visualizar os logs de estatísticas das tabelas do banco de dados atual.NotaUm usuário comum só pode consultar estatísticas das tabelas de sua propriedade no banco de dados atual.
CALL spm_grant('<db_name>_admin', 'Alibaba Cloud account ID'); -- For the simple permission model (SPM) CALL slpm_grant('<db_name>.admin', 'Alibaba Cloud account ID'); -- For the schema-level permission model (SLPM)
Consultas de exemplo
Caso de uso 1: Monitorar tendências de tabelas internas
-- Monitor trends for all internal tables in an instance, including storage size, number of files, read/write counts, and number of rows.
SELECT
db_name,
schema_name,
table_name,
collect_time :: date AS collect_date,
hot_storage_size,
cold_storage_size,
hot_file_count,
cold_file_count,
read_sql_count_1d,
write_sql_count_1d,
row_count
FROM
hologres.hg_table_info
WHERE
collect_time > (current_date - interval '1 week')::timestamptz -- For the last week
AND type ='TABLE'
ORDER BY collect_date desc ;
Caso de uso 2: Verificar padrões de acesso de tabelas grandes
-- Check access patterns for the top 10 tables by storage size.
SELECT
db_name,
schema_name,
table_name,
hot_storage_size + cold_storage_size AS total_storage_size,
row_count,
sum(read_sql_count_1d) AS total_read_count,
sum(write_sql_count_1d) AS total_write_count
FROM
hologres.hg_table_info
WHERE
collect_time > (current_date - interval '1 week')::timestamptz -- For the last week
AND type = 'TABLE'
AND (
cold_storage_size IS NOT NULL
OR hot_storage_size IS NOT NULL
)
GROUP BY db_name,schema_name,table_name,total_storage_size,row_count
ORDER BY total_storage_size DESC
LIMIT 10;
Caso de uso 3: Analisar tendências das 10 principais tabelas
-- Analyze access, storage, and data volume trends over the last week for the top 10 tables by storage (based on yesterday's statistics).
WITH top10_table AS (SELECT
db_name,
schema_name,
table_name,
hot_storage_size + cold_storage_size AS total_storage_size
FROM
hologres.hg_table_info
WHERE
collect_time >= (current_date - interval '1 day')::timestamptz -- Yesterday
AND collect_time < current_date
AND type = 'TABLE'
AND ( cold_storage_size IS NOT NULL OR hot_storage_size IS NOT NULL )
ORDER BY total_storage_size DESC
LIMIT 10
)
SELECT
base.db_name,
base.schema_name,
base.table_name,
base.hot_storage_size + cold_storage_size AS total_storage_size,
base.row_count,
base.read_sql_count_1d,
base.write_sql_count_1d,
base.collect_time :: date AS collect_date
FROM
hologres.hg_table_info AS base
LEFT JOIN
top10_table
ON
base.db_name = top10_table.db_name
AND base.schema_name = top10_table.schema_name
AND base.table_name = top10_table.table_name
WHERE
collect_time > (current_date - interval '1 week')::timestamptz -- For the last week
AND type = 'TABLE'
AND ( cold_storage_size IS NOT NULL OR hot_storage_size IS NOT NULL )
ORDER BY total_storage_size DESC , collect_date DESC;
Caso de uso 4: Analisar tendências das 10 menores tabelas
-- Analyze access, storage, and data volume trends over the last week for the 10 tables that use the least storage (based on yesterday's statistics).
WITH top10_table AS (SELECT
db_name,
schema_name,
table_name,
hot_storage_size + cold_storage_size AS total_storage_size
FROM
hologres.hg_table_info
WHERE
collect_time >= (current_date - interval '1 day')::timestamptz -- Yesterday
AND collect_time < current_date
AND type = 'TABLE'
ORDER BY total_storage_size ASC LIMIT 10
)
SELECT
base.db_name,
base.schema_name,
base.table_name,
base.hot_storage_size + cold_storage_size AS total_storage_size,
base.row_count,
base.read_sql_count_1d,
base.write_sql_count_1d,
base.collect_time :: date AS collect_date
FROM
hologres.hg_table_info AS base
RIGHT JOIN
top10_table
ON
base.db_name = top10_table.db_name
AND base.schema_name = top10_table.schema_name
AND base.table_name = top10_table.table_name
WHERE
collect_time > (current_date - interval '1 week')::timestamptz -- For the last week
AND type = 'TABLE'
ORDER BY total_storage_size ASC , collect_date DESC ;
Caso de uso 5: Identificar tabelas grandes com arquivos pequenos
-- View the number of files and storage size for each table, and sort by average file size.
-- The table group shows the shard count only for the current database. For other databases, this value is null.
SELECT
db_name,
schema_name,
table_name,
cold_storage_size + hot_storage_size AS total_storage_size,
cold_file_count + hot_file_count AS total_file_count,
(cold_storage_size + hot_storage_size) / (cold_file_count + hot_file_count) AS avg_file_size,
tmp_table_info.table_meta ->> 'table_group' AS table_group,
tg_info.shard_count
FROM
hologres.hg_table_info tmp_table_info
LEFT JOIN (
SELECT
tablegroup_name,
property_value AS shard_count
FROM
hologres.hg_table_group_properties
WHERE
property_key = 'shard_count'
) tg_info ON tmp_table_info.table_meta ->> 'table_group' = tg_info.tablegroup_name
WHERE
collect_time > (current_date - interval '1 day')::timestamptz
AND type = 'TABLE'
AND (
cold_storage_size IS NOT NULL
OR hot_storage_size IS NOT NULL
)
AND (
cold_file_count IS NOT NULL
OR hot_file_count IS NOT NULL
)
AND cold_file_count + hot_file_count <> 0
ORDER BY avg_file_size;
Caso de uso 6: Verificar alterações na contagem de linhas
-- View the last modification time and the total change in the number of rows from the last modification.
-- If the instance contains many tables, filter the CTE tmp_table_info to prevent long query times from fetching excessive data.
WITH tmp_table_info AS (
SELECT
db_name,
schema_name,
table_name,
row_count,
collect_time,
last_modify_time
FROM
hologres.hg_table_info
WHERE
last_modify_time IS NOT NULL
AND type = 'TABLE'
-- Add filters for tmp_table_info here.
-- For example: collect_time > (current_date - interval '14 day'):: timestamptz
-- For example: table_name like ''
-- For example: type = 'PARTITION'
)
SELECT
end_data.db_name AS db_name,
end_data.schema_name AS schema_name,
end_data.table_name AS table_name,
(end_data.row_count - start_data.row_count) AS modify_row_count,
end_data.row_count AS current_rows,
end_data.last_modify_time AS last_modify_time
FROM
(
SELECT
db_name,
schema_name,
table_name,
row_count,
last_modify_time
FROM
tmp_table_info
WHERE
collect_time > (current_date - interval '1 day')::timestamptz -- Query the last modification time of the table recorded yesterday.
) end_data
LEFT JOIN (
SELECT
db_name,
schema_name,
table_name,
row_count,
collect_time
FROM
tmp_table_info
) start_data ON (
end_data.db_name = start_data.db_name
AND end_data.schema_name = start_data.schema_name
AND end_data.table_name = start_data.table_name
AND end_data.last_modify_time::date = (start_data.collect_time + interval '1 day')::date
);