À grande échelle, les tables partitionnées physiques peuvent présenter deux problèmes de stabilité : une explosion des métadonnées lorsqu'un groupe de tables dépasse 10 000 tables enfants (partitions), et une dégradation des performances due à des opérations DDL fréquentes lors de l'ajout quotidien de nouvelles partitions. Hologres V3.1 introduit les tables partitionnées logiques pour résoudre ces deux problèmes. Cette rubrique décrit la procédure de migration d'une table partitionnée physique existante vers une table partitionnée logique.
Quand effectuer la migration
Effectuez la migration vers une table partitionnée logique si votre table partitionnée physique répond à l'une des conditions suivantes :
Un groupe de tables contient plus de 10 000 tables enfants, ce qui entraîne un volume important de métadonnées.
De nouvelles partitions sont ajoutées quotidiennement, générant des opérations DDL fréquentes.
Choisir une approche de migration
|
Approche |
Cas d'utilisation |
Interruption de service |
Risque |
|
Vérification par double écriture (recommandée) |
Toute migration où la continuité des activités est cruciale |
Minimale — les anciennes et nouvelles tables fonctionnent en parallèle |
Faible |
|
REBUILD (non recommandé) |
Lorsqu'une fenêtre de maintenance plus longue est acceptable et que certaines erreurs de lecture/écriture sont tolérées |
Plus longue — les tâches d'écriture s'arrêtent pendant la migration |
Élevé — les tâches peuvent échouer avant la fin de l'adaptation |
Migrer en utilisant la vérification par double écriture (recommandé)
Cette approche maintient l'exécution parallèle des anciennes et nouvelles tables pendant la migration, minimisant ainsi l'impact sur les activités.
Vue d'ensemble
Arrêtez les tâches d'écriture pour la table partitionnée physique, créez une nouvelle table partitionnée logique et copiez les données existantes.
Créez une tâche d'écriture pour la nouvelle table et activez la double écriture vers les deux tables.
Vérifiez la nouvelle table partitionnée logique.
Basculez les requêtes métier et les tâches d'écriture vers la nouvelle table.
Adaptez les tâches d'exploitation et de maintenance (O&M) à la nouvelle table.
Étape 1 : Créer une table partitionnée logique et charger les données existantes
Choisissez l'une des méthodes suivantes en fonction de votre situation.
Méthode 1 : CLONE (recommandée pour des volumes de données modérés sans modification du schéma)
hg_clone_to_logical_partition crée automatiquement une nouvelle table partitionnée logique et copie toutes les données de la table d'origine. La table partitionnée physique d'origine n'est pas supprimée.
Arrêtez les tâches d'écriture en temps réel avant d'exécuter CLONE. Une fois CLONE terminé, créez de nouvelles tâches d'écriture qui écrivent simultanément dans les anciennes et nouvelles tables afin de maintenir la synchronisation des données. Après la migration, vérifiez minutieusement les deux tables, finalisez l'adaptation des tâches d'importation, des tâches de requête et des tâches O&M, puis nettoyez la table partitionnée physique d'origine.
CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Pour des volumes de données importants, exécutez CLONE de manière asynchrone pour éviter les délais d'attente. Après la soumission, utilisez le query_id renvoyé pour vérifier la progression dans Obtenir des informations sur les requêtes.
SET statement_timeout = 0;
ASYNC CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Méthode 2 : Migration manuelle (pour les modifications de schéma ou les grands volumes de données)
La migration manuelle vous permet d'optimiser le schéma de la table et de contrôler le rythme de la migration.
Arrêtez les tâches d'écriture en temps réel avant d'importer les données. Une fois l'importation terminée, créez de nouvelles tâches d'écriture qui écrivent simultanément dans les deux tables. Après la migration, vérifiez minutieusement les deux tables, finalisez l'adaptation des tâches d'importation, des tâches de requête et des tâches O&M, puis nettoyez la table partitionnée physique d'origine.
Créez la table partitionnée logique. Consultez la section Conversion du schéma de table pour connaître les modifications DDL requises.
-
Importez les données historiques en utilisant
hg_insert_overwrite:CALL hg_insert_overwrite('logical_partition_table', '{20250601, 20250602}'::text[], 'SELECT * FROM tb');
Étape 2 : Activer la double écriture
Créez une nouvelle tâche d'écriture pour la table partitionnée logique et exécutez-la parallèlement à la tâche d'écriture existante pour la table partitionnée physique. Cela garantit que les deux tables restent synchronisées pendant la période de vérification.
Étape 3 : Vérifier la nouvelle table
Exécutez vos requêtes métier sur la table partitionnée logique et confirmez que les données et le comportement correspondent à ceux de la table partitionnée physique.
Étape 4 : Basculer les activités vers la nouvelle table
Utilisez l'une des méthodes suivantes :
Option A (recommandée) : Mettez à jour le nom de la table dans les tâches de requête pour pointer vers la nouvelle table partitionnée logique et ajoutez des conditions de filtre de partition si nécessaire.
Option B : Utilisez RENAME pour échanger les noms de table de manière atomique :
Cette opération renomme les tables existantes. Assurez-vous que vos tâches d'écriture et de requête sont prêtes à cibler la table parente avant l'exécution.
BEGIN;
ALTER TABLE <source_table_name> RENAME TO <source_table_name_archive>;
ALTER TABLE <target_table_name> RENAME TO <source_table_name>;
COMMIT;
Après le basculement, mettez à jour les tâches d'écriture et de requête qui ciblaient précédemment les tables enfants pour utiliser la table parente à la place, et ajoutez des conditions de filtre de partition.
Étape 5 : Adapter les tâches O&M
Mettez à jour toutes les tâches O&M qui diffèrent entre les tables partitionnées physiques et logiques. Consultez la section Adaptation des tâches O&M pour plus de détails.
Migrer en utilisant REBUILD (non recommandé)
Pendant la migration REBUILD, certaines tâches de lecture et d'écriture peuvent échouer. N'utilisez cette approche que si une fenêtre de maintenance plus longue est acceptable et que de brèves défaillances de tâches sont tolérables. Cette méthode n'est pas recommandée pour la migration des tables partitionnées.
Lorsque REBUILD est terminé, la table partitionnée physique est renommée en tmp_rebuild_old_<query_id>_<unique_id>_<table_name>. Les tâches associées peuvent générer des erreurs jusqu'à ce que vous ayez finalisé l'adaptation des tâches.
Arrêtez les tâches d'écriture pour la table partitionnée physique.
-
Exécutez REBUILD pour convertir la table :
-- Add the NOT NULL constraint to the partition field. ASYNC REBUILD TABLE user_profile ALTER ds SET NOT NULL; -- Convert the physical partitioned table to a logical partitioned table (retains the original). ASYNC REBUILD TABLE user_profile WITH (keep_source) TO logical partition;Pour plus d'informations, consultez REBUILD.
Mettez à jour les tâches d'écriture et redémarrez-les.
Adaptez les tâches de requête à la nouvelle table partitionnée logique.
Adaptez les tâches O&M à la nouvelle table partitionnée logique.
Conversion du schéma de table
Lors de la création d'une table partitionnée logique à partir du DDL d'une table partitionnée physique existante, effectuez les modifications suivantes :
Ajoutez le mot-clé
LOGICALavantPARTITION BY.Ajoutez
NOT NULLà la colonne de clé de partition.(Facultatif) Ajoutez une seconde clé de partition. Les tables partitionnées physiques prennent en charge une seule clé de partition ; les tables partitionnées logiques en prennent en charge jusqu'à deux.
Table partitionnée physique :
BEGIN;
CREATE TABLE user_profile (
a TEXT,
b TEXT,
ds TEXT
)
PARTITION BY LIST (ds);
CREATE TABLE user_profile_202503 PARTITION OF user_profile FOR VALUES IN ('202503');
CREATE TABLE user_profile_202504 PARTITION OF user_profile FOR VALUES IN ('202504');
COMMIT;
Table partitionnée logique — une clé de partition :
CREATE TABLE user_profile_lp_1 (
a TEXT,
b TEXT,
ds TEXT NOT NULL)
LOGICAL PARTITION BY LIST (ds);
Table partitionnée logique — deux clés de partition (division de ds en yy pour l'année et mm pour le mois) :
CREATE TABLE user_profile_lp_2 (
a TEXT,
b TEXT,
yy TEXT NOT NULL,
mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm);
Adaptation des tâches d'importation
Si votre tâche d'importation écrit dans la table partitionnée physique via Fixed Plan : aucune modification n'est nécessaire.
Si votre tâche d'importation écrit dans les tables enfants (partitions) : effectuez les modifications suivantes :
Supprimez les instructions qui créent des tables enfants. Les tables partitionnées logiques ne comportent pas de partitions physiques.
Modifiez le nom de la table cible du nom de la table enfant vers le nom de la table parente.
Scénario 1 : Créer une table enfant et importer des données
-- Original task: import data to physical partitioned table
CREATE TABLE user_profile_202505 PARTITION OF user_profile FOR VALUES IN ('202505');
INSERT INTO user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
-- Updated task: import data to logical partitioned table
INSERT INTO user_profile_lp_1 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
Scénario 2 : Remplacer le contenu d'une partition (Insert overwrite)
Si la tâche d'origine utilise hg_insert_overwrite pour remplacer plusieurs partitions à la fois, divisez les remplacements par partition, exécutez-les en série et utilisez la syntaxe native INSERT OVERWRITE après la migration vers une table partitionnée logique.
-- Original: physical partitioned table (temporary table method)
CREATE TABLE tmp_user_profile_202505(a text, b text, ds text);
INSERT INTO tmp_user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
BEGIN;
DROP TABLE IF EXISTS user_profile_202505;
ALTER TABLE tmp_user_profile_202505 RENAME TO user_profile_202505;
ALTER TABLE user_profile ATTACH PARTITION user_profile_202505 FOR VALUES IN ('202505');
COMMIT;
-- Original: physical partitioned table (hg_insert_overwrite method)
CALL hg_insert_overwrite('user_profile', '202505', $$SELECT a, b, mm FROM <source_table> WHERE ds='202505'$$);
-- Updated: logical partitioned table (native INSERT OVERWRITE)
INSERT OVERWRITE user_profile_lp_1 PARTITION (ds = '202505') SELECT a, b, ds FROM <source_table> WHERE ds='202505';
Adaptation des tâches de requête
Si votre requête cible la table parente : aucune modification n'est nécessaire.
Si votre requête cible une table enfant : modifiez-la pour interroger la table parente et ajoutez une condition de filtre de partition.
-- Original: physical partitioned table
SELECT * FROM user_profile_202504;
-- Updated: logical partitioned table
SELECT * FROM user_profile_lp_1 WHERE ds = '202504';
Adaptation des tâches O&M
Certaines opérations O&M utilisent des tables système ou des fonctions différentes pour les tables partitionnées logiques.
|
Opération |
Table partitionnée physique |
Table partitionnée logique |
|
Interroger le DDL de la table parente |
Fonction |
Aucune différence |
|
Interroger les propriétés de la table parente |
|
Aucune différence |
|
Interroger la liste des partitions |
|
|
|
Interroger les propriétés des partitions |
|
|
|
Interroger le stockage de la table parente |
|
|
Mappage des propriétés et des paramètres
Le tableau suivant établit la correspondance entre les paramètres de partitionnement automatique et autres propriétés de table pour les tables partitionnées physiques et logiques.
Si la table partitionnée physique d'origine utilise un champ non temporel (tel que TEXT) comme clé de partition et utilise la gestion automatique des partitions, Hologres V4.2 et versions ultérieures prennent en charge partition_expiration_time et partition_keep_hot_window sur la table partitionnée logique. Vous devez également définir partition_time_format pour spécifier le format de l'heure. Les versions antérieures à la V4.2 ne prennent pas en charge cette configuration.
|
Module |
Fonctionnalité |
Table partitionnée physique |
Table partitionnée logique |
|
Partitionnement automatique |
Activer |
|
Aucun paramètre équivalent |
|
Unité de temps |
|
Aucune configuration séparée ; seules les partitions temporelles sont prises en charge |
|
|
Fuseau horaire |
|
Aucun paramètre équivalent |
|
|
Partitions précréées |
|
Aucun paramètre équivalent |
|
|
Partitions à conserver |
|
|
|
|
Partitions chaudes à conserver |
|
|
|
|
Heure de planification |
|
Aucun paramètre équivalent |
|
|
Format de date/heure de la partition |
|
Aucun paramètre équivalent |
|
|
Gestion des partitions |
Conserver la partition |
|
|
|
Stockage chaud/froid |
|
|
|
|
Journal binaire |
Activer (table parente) |
|
|
|
Cycle de vie (table parente) |
|
|
|
|
Journal binaire dynamique par partition |
Non pris en charge |
|
|
|
Activer (partitions) |
Hérité de la table parente ; modification non prise en charge |
|
|
|
Cycle de vie (partitions) |
Les partitions prennent en charge la modification |
Hérité de la table parente ; modification non prise en charge |
|
|
Index et propriétés de table |
|
Les partitions prennent en charge la modification |
Hérité de la table parente ; modification non prise en charge |
|
|
Les partitions prennent en charge la modification |
Hérité de la table parente ; modification non prise en charge |
|
|
|
Hérité de la table parente ; modification non prise en charge |
Hérité de la table parente ; modification non prise en charge |
|
|
Clé primaire, |
Hérité de la table parente ; modification non prise en charge |
Hérité de la table parente ; modification non prise en charge |