À partir de la version V1.3, Hologres fournit la vue système hologres.hg_table_info pour collecter quotidiennement des statistiques sur les tables de votre instance. Vous pouvez interroger cette vue afin de surveiller et d'analyser les informations relatives aux tables, puis mettre en œuvre des mesures d'optimisation fondées sur ces statistiques.
Limitations
Cette fonctionnalité est disponible uniquement pour Hologres V1.3 et versions ultérieures. Si votre instance exécute une version antérieure, vous devez la mettre à niveau. Pour obtenir de l'aide, consultez Erreurs courantes lors de la préparation de la mise à niveau ou rejoignez le groupe DingTalk Hologres. Pour plus d'informations, consultez Comment obtenir davantage d'assistance en ligne ?.
Les données de la vue hologres.hg_table_info ont une fraîcheur de type T+1. Les données d'une journée donnée sont généralement mises à jour avant 05:00 le lendemain. Le jour où une instance Hologres est mise à niveau vers la version V1.3, aucune statistique de table n'est générée. Une requête exécutée ce jour-là renvoie l'erreur
meta warehouse store currently not available. Vous pourrez commencer à interroger les statistiques de table dès le lendemain de la mise à niveau.
Remarques d'utilisation
Les statistiques de table sont conservées pendant 30 jours par défaut.
Pour les tables internes non partitionnées (
type='TABLE'), vous pouvez consulter des statistiques détaillées, telles que l'espace de stockage, le nombre de fichiers, le nombre cumulé d'accès et le nombre de lignes.Pour les autres objets, comme les vues, les vues matérialisées, les tables externes et les tables parentes partitionnées, seules les informations de base sont disponibles. Cela inclut le nombre de partitions, le nom de la table externe mappée par une table externe, ainsi que les définitions des vues et des vues matérialisées.
La table hologres.hg_table_info appartient au système meta warehouse de Hologres. Étant donné qu'un échec d'interrogation de hologres.hg_table_info n'affecte pas les requêtes métier exécutées dans l'instance, la stabilité de la table hologres.hg_table_info n'est pas couverte par l'accord de niveau de service (SLA) du produit.
Vue hg_table_info
La vue hg_table_info contient les champs suivants.
Les statistiques de table sont stockées dans la vue système hologres.hg_table_info. Après la mise à niveau d'une instance vers la version V1.3, les informations de table sont collectées quotidiennement par défaut.
Certains champs peuvent être null pour les tables créées avant la mise à niveau de l'instance vers la version V1.3, car leurs informations de création n'ont pas été collectées. Pour les tables créées après la mise à niveau, tous les champs sont renseignés.
Champ | Type | Description | Remarques |
db_name | text | Nom de la base de données où réside la table. | Aucune |
schema_name | text | Nom du schéma où réside la table. | Aucune |
table_name | text | Nom de la table. | Aucune |
table_id | text | Identifiant unique de la table. Pour une table externe, le format de l'ID est | Aucune |
type | text | Type de l'objet. Valeurs possibles :
|
|
partition_spec | text | Condition de partitionnement. Ce champ est valide uniquement pour les tables enfants partitionnées. | Aucune |
is_partition | boolean | Indique si la table est une table enfant partitionnée. | Aucune |
owner_name | text | Nom d'utilisateur du propriétaire de la table. Vous pouvez joindre cette colonne à la colonne | Aucune |
create_time | timestamp with time zone | Horodatage de création de la table. | Aucune |
last_ddl_time | timestamp with time zone | Horodatage de la dernière mise à jour des métadonnées de la table. | Aucune |
last_modify_time | timestamp with time zone | Horodatage de la dernière modification des données de la table. | Aucune |
last_access_time | timestamp with time zone | Horodatage du dernier accès à la table. | Aucune |
view_def | text | Définition de la vue. | Ce champ est valide uniquement pour les vues. |
comment | text | Description de la table ou de la vue. | Aucune |
hot_storage_size | bigint | Taille du stockage hot utilisé par la table, en octets. | La taille de stockage indiquée dans |
cold_storage_size | bigint | Taille du stockage cold utilisé par la table, en octets. | La taille de stockage indiquée dans |
hot_file_count | bigint | Nombre de fichiers en stockage hot pour la table. | Aucune |
cold_file_count | bigint | Nombre de fichiers en stockage cold pour la table. | Aucune |
table_meta | jsonb | Métadonnées brutes de la table, au format JSONB. | Aucune |
row_count | bigint | Nombre de lignes dans la table ou la partition. | Pour une table parente partitionnée, il s'agit du nombre total de lignes across toutes ses tables enfants. |
collect_time | timestamp with time zone | Horodatage de la collecte des statistiques. | Aucune |
partition_count | bigint | Nombre de tables enfants partitionnées. | Ce champ est valide uniquement pour les tables parentes partitionnées. |
parent_schema_name | text | Nom du schéma de la table parente pour une table enfant partitionnée. | Ce champ est valide uniquement pour les tables enfants partitionnées. |
parent_table_name | text | Nom de la table parente pour une table enfant partitionnée. | Ce champ est valide uniquement pour les tables enfants partitionnées. |
total_read_count | bigint | Nombre cumulé d'opérations de lecture sur la table. Il s'agit d'une valeur approximative, car les opérations | Cette valeur est une approximation et n'est pas recommandée pour un comptage précis. |
total_write_count | bigint | Nombre cumulé d'opérations d'écriture sur la table. Il s'agit d'une valeur approximative, car les opérations | Cette valeur est une approximation et n'est pas recommandée pour un comptage précis. |
read_sql_count_1d | bigint | Nombre total d'opérations de lecture sur la table la veille (T-1), de 00:00 à 24:00 (UTC+8). |
|
write_sql_count_1d | bigint | Nombre total d'opérations d'écriture sur la table la veille (T-1), de 00:00 à 24:00 (UTC+8). |
|
Accorder des permissions
Vous devez disposer d'autorisations spécifiques pour interroger les statistiques de table. Cette section décrit les règles d'autorisation et la procédure pour les accorder.
-
Consulter les statistiques de table pour toutes les bases de données d'une instance Hologres
-
Accordez les privilèges superuser à l'utilisateur.
Un superuser peut consulter les statistiques de table pour toutes les bases de données d'une instance Hologres. La commande suivante accorde les privilèges superuser.
-- 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; -
Ajoutez les utilisateurs au groupe d'utilisateurs
pg_stat_scan_table.Outre un superuser, Hologres permet aux utilisateurs du groupe d'utilisateurs
pg_stat_scan_tables(pour les versions antérieures à V1.3.44) ou du groupe d'utilisateurspg_read_all_stats(pour les versions V1.3.44 et ultérieures) de consulter les journaux de statistiques de toutes les tables de la base de données. Si un utilisateur standard doit consulter tous les journaux, il peut contacter un superuser pour être ajouté au groupe d'utilisateurs concerné. La commande d'autorisation est la suivante.-- 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)
-
-
Consulter les statistiques de table pour la base de données actuelle
Si vous activez le modèle d'autorisation simple (SPM) ou le modèle d'autorisation au niveau du schéma (SLPM) et ajoutez un utilisateur au groupe d'utilisateurs
db_admin, le rôledb_adminpeut consulter les journaux de statistiques de table pour la base de données actuelle.RemarqueUn utilisateur standard peut interroger les statistiques uniquement pour les tables dont il est propriétaire dans la base de données actuelle.
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)
Exemples de requêtes
Cas d'utilisation 1 : Surveiller les tendances des tables internes
-- 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 ;
Cas d'utilisation 2 : Vérifier les modèles d'accès aux grandes tables
-- 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;
Cas d'utilisation 3 : Analyser les tendances pour les 10 premières tables
-- 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;
Cas d'utilisation 4 : Analyser les tendances pour les 10 dernières tables
-- 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 ;
Cas d'utilisation 5 : Identifier les grandes tables avec de petits fichiers
-- 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;
Cas d'utilisation 6 : Vérifier les variations du nombre de lignes
-- 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
);