A partir de la versión V1.3, Hologres ofrece la vista del sistema hologres.hg_table_info para recopilar estadísticas diarias sobre las tablas de su instancia. Puede consultar esta vista para supervisar y analizar la información de las tablas, y aplicar medidas de optimización basadas en dichas estadísticas.
Limitaciones
Esta función solo está disponible en Hologres V1.3 y versiones posteriores. Si su instancia tiene una versión anterior, debe actualizarla. Para obtener asistencia, consulte Common upgrade preparation errors o únase al grupo de DingTalk de Hologres. Para más información, consulte How to get more online support?.
Los datos en la vista hologres.hg_table_info tienen una actualización T+1. Por lo general, los datos de un día determinado se actualizan antes de las 05:00 del día siguiente. El día que se actualiza una instancia de Hologres a la versión V1.3 no se generan estadísticas de tablas. Una consulta realizada ese día devolverá el error
meta warehouse store currently not available. Podrá comenzar a consultar las estadísticas de las tablas al día siguiente de la actualización.
Notas de uso
Las estadísticas de las tablas se conservan durante 30 días de forma predeterminada.
Para las tablas internas no particionadas (
type='TABLE'), puede consultar estadísticas detalladas como el espacio de almacenamiento, la cantidad de archivos, los recuentos acumulados de acceso y el número de filas.Para otros objetos, como vistas, vistas materializadas, tablas externas y tablas padre particionadas, solo hay información básica disponible. Esto incluye el número de particiones, el nombre de la tabla externa a la que se asigna una tabla foránea y las definiciones de vistas y vistas materializadas.
La tabla hologres.hg_table_info pertenece al sistema de meta warehouse de Hologres. Dado que un fallo al consultar hologres.hg_table_info no afecta las consultas de negocio que se ejecutan en la instancia, la estabilidad de la tabla hologres.hg_table_info no está cubierta por el acuerdo de nivel de servicio (SLA) del producto.
Vista hg_table_info
La vista hg_table_info contiene los siguientes campos.
Las estadísticas de las tablas se almacenan en la vista del sistema hologres.hg_table_info. Después de actualizar una instancia a la versión V1.3, la información de las tablas se recopila diariamente de forma predeterminada.
Algunos campos pueden ser nulos para las tablas creadas antes de actualizar la instancia a la versión V1.3, ya que no se recopiló su información de creación. En el caso de las tablas creadas después de la actualización, todos los campos están completos.
Campo | Tipo | Descripción | Observaciones |
db_name | text | Nombre de la base de datos donde reside la tabla. | Ninguna |
schema_name | text | Nombre del esquema donde reside la tabla. | Ninguna |
table_name | text | Nombre de la tabla. | Ninguna |
table_id | text | Identificador único de la tabla. Para una tabla externa, el formato del ID es | Ninguna |
type | text | Tipo de objeto. Valores válidos:
|
|
partition_spec | text | Condición de particionamiento. Este campo solo es válido para tablas hijas particionadas. | Ninguna |
is_partition | boolean | Indica si la tabla es una tabla hija particionada. | Ninguna |
owner_name | text | Nombre de usuario del propietario de la tabla. Puede unir esta columna con la columna | Ninguna |
create_time | timestamp with time zone | Marca de tiempo de creación de la tabla. | Ninguna |
last_ddl_time | timestamp with time zone | Marca de tiempo de la última actualización de los metadatos de la tabla. | Ninguna |
last_modify_time | timestamp with time zone | Marca de tiempo de la última modificación de los datos de la tabla. | Ninguna |
last_access_time | timestamp with time zone | Marca de tiempo del último acceso a la tabla. | Ninguna |
view_def | text | Definición de la vista. | Este campo solo es válido para vistas. |
comment | text | Descripción de la tabla o vista. | Ninguna |
hot_storage_size | bigint | Tamaño del almacenamiento en caliente utilizado por la tabla, en bytes. | El tamaño de almacenamiento reportado en |
cold_storage_size | bigint | Tamaño del almacenamiento en frío utilizado por la tabla, en bytes. | El tamaño de almacenamiento reportado en |
hot_file_count | bigint | Número de archivos en almacenamiento en caliente para la tabla. | Ninguna |
cold_file_count | bigint | Número de archivos en almacenamiento en frío para la tabla. | Ninguna |
table_meta | jsonb | Metadatos sin procesar de la tabla, en formato JSONB. | Ninguna |
row_count | bigint | Número de filas en la tabla o partición. | Para una tabla padre particionada, este es el número total de filas en todas sus tablas hijas. |
collect_time | timestamp with time zone | Marca de tiempo de la recopilación de las estadísticas. | Ninguna |
partition_count | bigint | Número de tablas hijas particionadas. | Este campo solo es válido para tablas padre particionadas. |
parent_schema_name | text | Nombre del esquema de la tabla padre para una tabla hija particionada. | Este campo solo es válido para tablas hijas particionadas. |
parent_table_name | text | Nombre de la tabla padre para una tabla hija particionada. | Este campo solo es válido para tablas hijas particionadas. |
total_read_count | bigint | Número acumulado de operaciones de lectura en la tabla. Es un valor aproximado, ya que las operaciones | Este valor es una aproximación y no se recomienda para recuentos precisos. |
total_write_count | bigint | Número acumulado de operaciones de escritura en la tabla. Es un valor aproximado, ya que las operaciones | Este valor es una aproximación y no se recomienda para recuentos precisos. |
read_sql_count_1d | bigint | Número total de operaciones de lectura en la tabla durante el día anterior (T-1), de 00:00 a 24:00 (UTC+8). |
|
write_sql_count_1d | bigint | Número total de operaciones de escritura en la tabla durante el día anterior (T-1), de 00:00 a 24:00 (UTC+8). |
|
Otorgar permisos
Debe contar con permisos específicos para consultar las estadísticas de las tablas. Esta sección describe las reglas de permisos y cómo otorgarlos.
-
Consultar estadísticas de tablas para todas las bases de datos en una instancia de Hologres
-
Otorgue privilegios de superusuario al usuario.
Un superusuario puede consultar las estadísticas de las tablas de todas las bases de datos en una instancia de Hologres. El siguiente comando otorga privilegios de superusuario.
-- 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; -
Agregue usuarios al grupo de usuarios
pg_stat_scan_table.Además del superusuario, Hologres permite que los usuarios del grupo
pg_stat_scan_tables(para versiones anteriores a V1.3.44) o del grupopg_read_all_stats(para V1.3.44 y versiones posteriores) consulten los registros de estadísticas de todas las tablas de la base de datos. Si un usuario regular necesita consultar todos los registros, puede contactar a un superusuario para que lo agregue al grupo correspondiente. El comando de autorización es el siguiente.-- 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)
-
-
Consultar estadísticas de tablas para la base de datos actual
Si habilita el modelo de permisos simple (SPM) o el modelo de permisos a nivel de esquema (SLPM) y agrega un usuario al grupo
db_admin, el roldb_adminpodrá consultar los registros de estadísticas de las tablas de la base de datos actual.NotaUn usuario regular solo puede consultar estadísticas de las tablas de su propiedad en la base de datos actual.
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 ejemplo
Caso de uso 1: Supervisar tendencias de tablas 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: Comprobar patrones de acceso de tablas 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: Analizar tendencias de las 10 tablas principales
-- 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: Analizar tendencias de las 10 tablas con menor uso
-- 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 tablas grandes con archivos pequeños
-- 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: Comprobar cambios en el recuento de filas
-- 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
);