Les tables de partitionnement logique assurent une gestion automatique du cycle de vie des partitions : Hologres crée les partitions à l'arrivée des données et les supprime lorsqu'elles deviennent vides. La table parente est une table physique ; chaque partition est un concept logique, et non un objet physique distinct.
Utilisez des tables de partitionnement logique lorsque :
Votre jeu de données est volumineux et basé sur des séries temporelles ou des catégories (journaux quotidiens, flux d'événements, données par locataire).
Vous souhaitez que Hologres gère automatiquement la création et le nettoyage des partitions, sans surcharge liée aux instructions DDL.
Vous souhaitez mettre en place une expiration par partition, un stockage hiérarchisé (données chaudes/froides) ou une génération sélective de Binlog.
Privilégiez les tables de partitionnement physique si vous remplacez fréquemment des partitions entières via TRUNCATE ou INSERT OVERWRITE. Ces opérations sont plus rapides sur les partitions physiques, car elles évitent les suppressions à grande échelle.
Les tables de partitionnement logique nécessitent Hologres 3.1 ou une version ultérieure.
Limitations
Seul le partitionnement
LISTest pris en charge. Les typesRANGEetHASHne sont pas pris en charge.Une clé de partition peut inclure une ou deux colonnes.
Types de données pris en charge pour les clés de partition :
INT,TEXT,VARCHAR,DATE,TIMESTAMPetTIMESTAMPTZ.Les clés de partition doivent être définies comme
NOT NULL.La clé de partition d'une table de partitionnement logique prend en charge les colonnes générées.
Une seule table de partitionnement logique prend en charge jusqu'à 5 200 partitions. Une base de données prend en charge un total maximal de 200 000 partitions logiques.
Limites liées à l'importation par lots
| Scénario | Seuil | Comportement |
|---|---|---|
| Tâche d'importation par lots unique | > 50 partitions | Erreur : Bulkload partition count exceed limit, partition count is xxx, limit is xxx |
| Écritures concurrentes Fixed Plan (par table) | > 30 partitions | Limitation de débit — Hologres attend quelques secondes, puis soumet automatiquement la requête |
| Écritures concurrentes Fixed Plan (par table) | > 100 partitions | Erreur : mem partition count exceed reject limit |
Limites des partitions non persistantes (par nœud worker)
Une partition non persistante est une partition écrite en mémoire mais pas encore vidée sur le disque. Le nombre est calculé comme suit : partitions utilisateur × nombre de shards × nombre d'index par table. Le nombre de shards inclut les shards de réplication.
| Seuil | Comportement |
|---|---|
| > 500 partitions non persistantes | Limitation de débit — Hologres attend quelques secondes, puis soumet automatiquement la requête |
| > 5 000 partitions non persistantes | Erreur : mem partition count exceed reject limit |
Remarques d'utilisation
Granularité des partitions : Évitez les partitions contenant moins de 100 millions de lignes. Des partitions trop fines réduisent les avantages de l'accélération des requêtes et augmentent le risque d'accumulation de petits fichiers. Par exemple, un partitionnement par jour est raisonnable pour les charges de travail à fort volume ; un partitionnement par ID client ou par intervalles inférieurs à une heure est généralement trop fin.
Modèle d'écriture : Écrivez les données dans les partitions de manière séquentielle. Évitez d'écrire simultanément dans de nombreuses partitions.
Qualité des données : Assurez-vous que les données entrantes sont propres. Des données erronées, telles que des horodatages qui ne correspondent pas à minuit lors de l'utilisation de partitions quotidiennes, peuvent entraîner une croissance inattendue du nombre de partitions.
Cycle de vie des partitions : Ne créez ni ne supprimez manuellement les partitions. Les partitions n'existent que lorsqu'elles contiennent des données. Lorsque toutes les données d'une partition sont supprimées, Hologres supprime la partition de manière asynchrone.
TRUNCATE et Binlog : L'instruction TRUNCATE ne génère pas de Binlog. Pour désactiver la génération de Binlog pour une session, exécutez
SET hg_experimental_generate_binlog = offavant d'utiliser TRUNCATE.Modification des propriétés de table : Pour modifier les propriétés d'une table de partitionnement logique, utilisez la syntaxe REBUILD. Le backend divise automatiquement la tâche et l'exécute séquentiellement par partition. Pour les opérations de redistribution (par exemple, déplacer la table vers un autre groupe de tables), n'utilisez pas la procédure stockée
HG_MOVE_TABLE_TO_TABLE_GROUP. Consultez le Guide d'opération pour les groupes de tables et le nombre de shards pour connaître la méthode appropriée.
Créer une table de partitionnement logique
Syntaxe
-- Create a logical partition parent table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> ([
{
<column_name> <column_type> [ <column_constraints>, [...]]
| <table_constraints>
[, ...]
}
])
LOGICAL PARTITION BY LIST(<partition_column_1> [, <partition_column_2>])
[WITH(
<property_name> = <property_value>
[, ...]
)];
Les partitions sont créées et supprimées automatiquement en fonction des données. Ne créez ni ne supprimez manuellement les partitions.
Paramètres
| Paramètre | Description |
|---|---|
schema_name |
Le schéma qui contient la table. Omettez ce paramètre si les tables parentes et enfants se trouvent dans le même schéma. |
table_name |
Le nom de la table de partitionnement parente. |
column_name |
Le nom d'une colonne. |
column_type |
Le type de données de la colonne. |
column_constraints |
Contraintes au niveau de la colonne. |
table_constraints |
Contraintes au niveau de la table. |
partition_column |
La clé de partition. Spécifiez une ou deux colonnes. |
property_name |
Le nom d'une propriété de table. |
property_value |
La valeur à attribuer à la propriété de table. |
Propriétés de table
Ces propriétés sont définies sur la table parente et s'appliquent à toutes les partitions. Étant donné que la table parente est une table physique et que les partitions sont des concepts logiques, vous ne pouvez pas définir ces propriétés directement sur des partitions individuelles.
| Propriété | Valeur par défaut | Valeurs valides | Notes |
|---|---|---|---|
partition_time_format |
Aucune | Voir les notes | Requis uniquement lorsque la clé de partition est de type TEXT. Pris en charge depuis Hologres V4.2. Valeurs valides :
Remarque
Définissez cette propriété avant |
partition_expiration_time |
Aucune (pas de nettoyage automatique) | '30 day', '12 month', etc. |
Utilisez la même unité de temps que votre clé de partition. Remarque
|
partition_keep_hot_window |
Toutes les données restent chaudes | '30 day', '12 month', etc. |
Les données en dehors de cette fenêtre sont déplacées vers le stockage froid de manière asynchrone. Voir [Stockage hiérarchisé des données](t2274113.xdita#). Remarque
|
partition_require_filter |
FALSE |
TRUE, FALSE |
Si la valeur est TRUE, les requêtes sur la table parente doivent inclure une condition de filtre de partition. Les requêtes sans filtre échouent. |
binlog_level |
'none' |
'none', 'replica' |
Active ou désactive Binlog pour la table parente. Voir [S'abonner à la journalisation binaire Hologres](t2037122.xdita#). |
binlog_ttl |
2592000 (30 jours, en secondes) |
Entier (secondes) | La durée de conservation (TTL) des données Binlog. |
partition_generate_binlog_window |
Aucune (toutes les données génèrent un Binlog) | '3 day', '12 hour', etc. |
Seules les données des partitions créées dans la fenêtre spécifiée génèrent un Binlog. S'applique uniquement aux tables dotées d'une clé de partition unique basée sur le temps. |
Autres propriétés (index, orientation, etc.) |
— | — | Les tables de partitionnement logique prennent en charge distribution_key, clustering_key, orientation, time_to_live_in_seconds et d'autres propriétés standard. Voir [CREATE TABLE](t1881820.xdita#section-n50-wsw-wnc) et le [Guide d'optimisation de la création de tables basé sur les scénarios](t2351175.xdita#). Les propriétés de gestion dynamique des partitions issues des tables de partitionnement physique ne sont pas prises en charge. Voir [Gestion dynamique des partitions](t2606189.xdita#). |
Propriétés de partition
Ces propriétés s'appliquent aux partitions individuelles. Modifiez-les à l'aide de la commande ALTER LOGICAL PARTITION TABLE.
| Propriété | Valeur par défaut | Valeurs valides | Comportement |
|---|---|---|---|
keep_alive |
FALSE |
TRUE, FALSE |
Si TRUE, la partition n'est jamais nettoyée automatiquement, même si partition_expiration_time est définie sur la table parente. |
storage_mode |
Non défini (suit la valeur partition_keep_hot_window de la table parente) |
'hot', 'cold' |
Remplace la valeur partition_keep_hot_window de la table parente pour cette partition. |
generate_binlog |
Non défini (suit la valeur partition_generate_binlog_window de la table parente) |
'on', 'off' |
Remplace la valeur partition_generate_binlog_window de la table parente pour cette partition. |
Exemples
Exemple 1 : Colonne régulière comme clé de partition
CREATE TABLE public.hologres_logical_parent_1 (
a TEXT,
b INT,
c TIMESTAMP,
ds DATE NOT NULL,
PRIMARY KEY (b, ds))
LOGICAL PARTITION BY LIST (ds)
WITH (
orientation = 'column',
distribution_key = 'b',
partition_expiration_time = '30 day',
partition_keep_hot_window = '15 day',
partition_require_filter = TRUE,
binlog_level = 'replica',
partition_generate_binlog_window = '3 day'
);
Exemple 2 : Colonne générée comme clé de partition
La clé de partition ds est dérivée de la colonne c à l'aide de la fonction date_trunc. Cela affecte automatiquement chaque ligne à la partition quotidienne correcte sans que l'appelant n'ait à calculer la valeur de partition. Pour plus d'informations, consultez les colonnes générées Hologres.
CREATE TABLE public.hologres_logical_parent_2 (
a TEXT,
b INT,
c TIMESTAMP,
ds TIMESTAMP GENERATED ALWAYS AS (date_trunc('day', c)) STORED NOT NULL,
PRIMARY KEY (b, ds))
LOGICAL PARTITION BY LIST (ds)
WITH (
orientation = 'column',
distribution_key = 'b',
partition_expiration_time = '30 day',
partition_keep_hot_window = '15 day',
partition_require_filter = TRUE,
binlog_level = 'replica',
partition_generate_binlog_window = '3 day'
);
Exemple 3 : Deux colonnes comme clés de partition
CREATE TABLE public.hologres_logical_parent_3 (
a TEXT,
b INT,
yy TEXT NOT NULL,
mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm)
WITH (
orientation = 'column',
distribution_key = 'b',
partition_require_filter = TRUE
);
Gérer les données
Granularité du verrouillage
| Opération | Type de verrou | Notes |
|---|---|---|
| Importation par lots ou mise à jour pour une partition spécifiée ; INSERT OVERWRITE ; TRUNCATE pour une partition spécifiée | Verrou de partition | Lors de l'exécution à l'aide des ressources d'une instance locale ou d'un groupe de calcul : verrou de partition. Les autres partitions restent inchangées. Lors de l'exécution à l'aide des ressources Serverless : verrou de table avant la version V4.2 ; verrou de partition à partir de la version V4.2. |
| Importation par lots ou mise à jour sans spécifier de partition ; TRUNCATE sans spécifier de partition ; toute instruction DELETE | Verrou de table | Les autres opérations de gestion des données attendent la libération du verrou. |
| Écriture, mise à jour ou suppression via Fixed Plan | Verrou de ligne | Entre en conflit avec l'importation par lots, la mise à jour ou la suppression. N'entre pas en conflit avec d'autres opérations Fixed Plan. |
Choisir une méthode de nettoyage des données
| Méthode | Quand l'utiliser | Type de verrou | Notes |
|---|---|---|---|
DELETE |
Supprimer sélectivement les lignes correspondant à une condition | Verrou de table | Plus lent pour les grands jeux de données |
TRUNCATE (au niveau de la partition) |
Supprimer toutes les données d'une ou plusieurs partitions spécifiques | Verrou de partition | Plus rapide que DELETE ; ne génère pas de Binlog ; non pris en charge dans le DML du groupe de calcul — utilisez le groupe de calcul leader |
TRUNCATE (au niveau de la table) |
Supprimer toutes les données de la table parente | Verrou de table | Le plus rapide pour un nettoyage complet ; ne génère pas de Binlog |
INSERT OVERWRITE |
Remplacer toutes les données d'une partition par de nouvelles données | Verrou de partition (par partition) | Synchrone ; si plusieurs partitions sont spécifiées, elles sont traitées en parallèle — divisez-les en tâches séquentielles pour réduire l'utilisation du CPU et de la mémoire |
Écrire dans la table parente
Les opérations d'écriture, de mise à jour et de nettoyage des données fonctionnent de la même manière que pour les tables standard. Hologres crée ou supprime automatiquement les partitions en fonction des données.
-- Write data; Hologres creates partitions automatically
INSERT INTO public.hologres_logical_parent_2
VALUES
('a', 1, '2025-03-16 10:00:00'),
('b', 2, '2025-03-17 11:00:00'),
('c', 3, '2025-03-18 12:00:00'),
('d', 4, '2025-03-19 13:00:00'),
('e', 5, '2025-03-20 14:00:00');
-- Delete rows (table lock)
DELETE FROM public.hologres_logical_parent_2 WHERE ds = '2025-03-20';
-- Truncate the entire parent table (no Binlog generated)
SET hg_experimental_generate_binlog = off;
TRUNCATE public.hologres_logical_parent_2;
Écrire dans une partition spécifique
-- Import into a specified partition
INSERT INTO public.hologres_logical_parent_1
PARTITION (ds = '2025-03-16')
VALUES
('a', 1, '2025-03-16 10:00:00', '2025-03-16');
-- Rows that don't match the specified partition are silently skipped (no error)
INSERT INTO public.hologres_logical_parent_1
PARTITION (ds = '2025-03-16')
VALUES
('a', 1, '2025-03-16 10:00:00', '2025-03-16'),
('b', 2, '2025-03-17 11:00:00', '2025-03-17');
Nettoyer les données de partition
-- Delete rows from specific partitions (table lock)
DELETE FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16' or ds = '2025-03-17';
-- Truncate specific partitions (partition lock, no Binlog generated)
-- Not supported in compute group DML; run in the leader compute group.
SET hg_experimental_generate_binlog = off;
TRUNCATE public.hologres_logical_parent_1 PARTITION (ds = '2025-03-16') PARTITION (ds = '2025-03-17');
Écraser une partition
Hologres 3.1 et versions ultérieures prennent en charge la syntaxe native INSERT OVERWRITE pour les tables de partitionnement logique. Voir INSERT OVERWRITE.
INSERT OVERWRITE est synchrone. Si vous spécifiez plusieurs partitions logiques, Hologres les traite en parallèle, ce qui augmente l'utilisation du CPU et de la mémoire. Divisez les écrasements multi-partitions en tâches séquentielles.
Interroger les tables de partitionnement logique
-- Query with a partition filter condition
SELECT * FROM public.hologres_logical_parent_1 WHERE ds = '2025-03-16';
-- Query without a partition filter condition
-- Requires partition_require_filter = FALSE on the parent table
SELECT * FROM public.hologres_logical_parent_1;
Si partition_require_filter est défini sur TRUE, les requêtes sans condition de filtre de partition échouent.
Afficher les métadonnées
Hologres fournit des tables système et des fonctions pour interroger les métadonnées des tables de partitionnement logique.
| Objet | Objectif |
|---|---|
hologres.hg_table_properties |
Afficher les propriétés de la table |
hologres.hg_list_logical_partition('<table_name>') |
Lister toutes les partitions d'une table de partitionnement logique |
hologres.hg_logical_partitioned_table_properties |
Lister toutes les partitions logiques et leurs propriétés dans l'instance actuelle |
hologres.hg_partition_file_status('<table_name>') |
Interroger les tailles de stockage chaud et froid ainsi que le nombre de fichiers pour toutes les partitions (Hologres 3.1.4 et versions ultérieures) |
Vérifier si une table est une table de partitionnement logique :
SELECT *
FROM hologres.hg_table_properties
WHERE
table_name = '<table_name>'
AND property_key = 'is_logical_partitioned_table'
AND property_value = 'true';
Lister toutes les partitions :
SELECT * FROM hologres.hg_list_logical_partition('<schema_name>.<table_name>');
Lister les configurations des propriétés de partition :
Cette requête renvoie uniquement les configurations qui diffèrent entre les partitions enfants et la table parente. Un résultat vide signifie qu'aucune substitution au niveau de la partition n'est définie.
SELECT *
FROM hologres.hg_logical_partitioned_table_properties
WHERE
table_namespace = '<schema_name>'
AND table_name = '<table_name>'
ORDER BY partition DESC;
Afficher les tailles de stockage chaud et froid :
SELECT * FROM hologres.hg_partition_file_status('<schema_name>.<table_name>');
Les partitions logiques sont également compatibles avec les tables système standard de Hologres.
Afficher le DDL d'une table de partitionnement logique :
SELECT hg_dump_script('<schema_name>.<table_name>');
Afficher les propriétés de la table parente :
SELECT *
FROM hologres.hg_table_properties
WHERE
table_namespace = '<schema_name>'
AND table_name = '<table_name>';
Afficher la plus grande partition :
Étant donné que le nettoyage des données et celui des partitions sont asynchrones, MAX_PT peut renvoyer des résultats incorrects si la plus grande partition a été vidée. Utilisez INSERT OVERWRITE pour supprimer les données afin d'éviter ce problème.
SELECT MAX_PT('<schema_name>.<table_name>');
Vérifier si une table de partition dépasse la limite de partitions :
CREATE OR REPLACE PROCEDURE check_logical_partition_count()
LANGUAGE 'plpgsql'
AS $$
DECLARE
table_max_partition_count bigint;
table_partition_count bigint;
exceeded_logical_partition_limit boolean;
row_record record;
BEGIN
SELECT substring(result FROM '^[^:]*: (\d+)')::INTEGER INTO table_max_partition_count
FROM hg_admin_command('get_global_flag', 'flag=table_max_partition_count') AS result;
RAISE NOTICE 'table_max_partition_count=%', table_max_partition_count;
FOR row_record IN
SELECT table_namespace, table_name
FROM hologres.hg_table_properties
WHERE property_key = 'is_logical_partitioned_table' AND (property_value = 'true' OR property_value = 't')
LOOP
SELECT count(*) INTO table_partition_count
FROM hologres.hg_list_logical_partition(quote_ident(row_record.table_namespace) || '.' || quote_ident(row_record.table_name));
IF table_partition_count > table_max_partition_count THEN
RAISE NOTICE 'table %.% partition count exceeds limit (% > %)', row_record.table_namespace, row_record.table_name, table_partition_count, table_max_partition_count;
END IF;
END LOOP;
END;
$$;
CALL check_logical_partition_count();