Utilisez l'instruction CREATE PARTITION TABLE pour diviser une table en tables filles selon une colonne de clé de partition. Une table parent est partitionnée en différentes tables filles en fonction des valeurs de la clé de partition. Les données contenues dans les tables filles sont accessibles publiquement. Chaque table fille contient les lignes correspondant à une valeur de partition spécifique. Pour interroger les données d'une table partitionnée, vous devez spécifier une partition afin que le système puisse ignorer les partitions non pertinentes, ce qui réduit le volume de données analysées.
Dans cette rubrique, le terme « table parent » désigne une table parent partitionnée et le terme « table fille » désigne une table fille partitionnée.
Quand utiliser les tables partitionnées
Privilégiez les tables partitionnées lorsque les avantages liés à l'élimination des partitions ou aux opérations de données en masse surpassent clairement la surcharge liée à la gestion de plusieurs tables filles.
Utilisez des tables partitionnées lorsque :
Le volume quotidien de données pour une seule partition dépasse 100 millions de lignes (pour un partitionnement basé sur la date).
Vous devez remplacer ou supprimer en masse les données d'une partition entière à l'aide des commandes
TRUNCATEouDROP. Ces deux opérations s'exécutent instantanément sur une table fille et évitent les analyses complètes.
Évitez les tables partitionnées lorsque :
La source de données est un système de base de données. Un nombre excessif de partitions gaspille les ressources d'E/S. Spécifiez plutôt les colonnes de filtre couramment utilisées comme clé de segment pour activer l'accélération des requêtes basée sur l'index.
Le volume quotidien de données est inférieur à 100 millions de lignes par partition. Les petites partitions n'offrent qu'une accélération négligeable des requêtes. Optez pour une granularité plus grossière.
Gardez à l'esprit que chaque table fille est stockée sous forme d'un ensemble distinct de fichiers et équivaut à une table non partitionnée dans le stockage des métadonnées. Un grand nombre de tables filles augmente le volume de métadonnées et génère de nombreux petits fichiers et fragments.
Limitations
-
Les données doivent être écrites dans une table fille, et non directement dans la table parent.
Realtime Compute for Apache Flink permet d'écrire des données dans une table parent en temps réel. Pour plus de détails, consultez la section Écrire des données dans une table Hologres sink partitionnée en temps réel .
Hologres prend uniquement en charge le partitionnement par liste (
PARTITION BY LIST).La clé de partition doit correspondre à une seule colonne.
Chaque règle de partitionnement ne peut servir à créer qu'une seule table partitionnée.
Si la table parent possède une clé primaire, la colonne de clé de partition doit faire partie de cette clé primaire.
Créer une table partitionnée
Une table partitionnée se compose d'une table parent (qui définit le schéma et la règle de partition) et d'une ou plusieurs tables filles (chacune couvrant des valeurs de partition spécifiques). Vous devez créer les tables filles avant de pouvoir y écrire des données.
Vous pouvez également activer le partitionnement dynamique pour permettre à Hologres de créer automatiquement des tables filles selon les règles que vous configurez.
Syntaxe
-- Create the parent table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name> (
{
<column_name> <column_type> [<column_constraints> [, ...]]
| <table_constraints>
[, ...]
}
)
PARTITION BY LIST (<column_name>);
-- Create a child table
CREATE TABLE [IF NOT EXISTS] [<schema_name>.]<table_name>
PARTITION OF <parent_table>
FOR VALUES IN (<string_literal>);
Paramètres
| Paramètre | Description |
|---|---|
IF NOT EXISTS |
Supprime l'erreur si une table portant le même nom existe déjà. |
schema_name |
Schéma contenant la table. Omettez ce paramètre si les tables parent et fille résident dans le même schéma ; il est requis pour les créations inter-schémas. |
table_name |
Nom de la table parent ou de la table fille à créer. |
column_name |
Nom de la colonne. |
column_type |
Type de données de la colonne. |
column_constraints |
Contraintes au niveau de la colonne (par exemple, NOT NULL). |
table_constraints |
Contraintes au niveau de la table (par exemple, PRIMARY KEY). |
parent_table |
Nom de la table parent à laquelle appartient la table fille. |
string_literal |
Valeur de la clé de partition pour la table fille. |
Types de données pris en charge pour les colonnes de clé de partition :
| Type de données | Versions prises en charge |
|---|---|
TEXT |
Toutes les versions |
VARCHAR |
Toutes les versions |
INT |
Toutes les versions |
DATE |
Hologres V1.3.22 et versions ultérieures |
Exemples
Les exemples suivants créent une table de faits partitionnée où chaque table fille contient les données d'une journée. Ce modèle est courant lorsque vous devez tronquer ou remplacer efficacement une journée complète de données.
Exemple 1 : Table parent sans clé primaire
Les deux variantes de syntaxe sont équivalentes. Privilégiez la syntaxe V2.1+ si votre version de Hologres la prend en charge.
Hologres V2.1 et versions ultérieures :
BEGIN;
CREATE TABLE public.hologres_parent (
a TEXT,
b INT,
c TIMESTAMP,
d TEXT
)
PARTITION BY LIST (a)
WITH (orientation = 'column');
CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN ('v1');
CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN ('v2');
CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN ('v3');
COMMIT;
Toutes les versions de Hologres :
BEGIN;
CREATE TABLE public.hologres_parent(
a TEXT,
b INT,
c TIMESTAMP,
d TEXT
)
PARTITION BY LIST(a);
CALL set_table_property('public.hologres_parent', 'orientation', 'column');
CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN('v1');
CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN('v2');
CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN('v3');
COMMIT;
Exemple 2 : Table parent avec clé primaire
Lorsqu'une clé primaire est définie, la colonne de clé de partition (ds dans cet exemple) doit faire partie de la clé primaire.
Hologres V2.1 et versions ultérieures :
BEGIN;
CREATE TABLE public.hologres_parent_2 (
a TEXT,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY (ds, b)
)
PARTITION BY LIST (ds)
WITH (orientation = 'column');
CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201215');
CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201216');
CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201217');
COMMIT;
Toutes les versions de Hologres :
BEGIN;
CREATE TABLE public.hologres_parent_2(
a TEXT,
b INT,
c TIMESTAMP,
d TEXT,
ds TEXT,
PRIMARY KEY (ds, b)
)
PARTITION BY LIST(ds);
CALL set_table_property('public.hologres_parent_2', 'orientation', 'column');
CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201215');
CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201216');
CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201217');
COMMIT;
Lister les tables filles
Listez toutes les tables filles d'une table parent à l'aide de HoloWeb ou de l'instruction SQL suivante. Remplacez parent_table_name par le nom réel de la table parent.
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname = 'parent_table_name';
Règles d'héritage des propriétés
Lorsque vous créez une table fille à l'aide de CREATE TABLE ... PARTITION OF, celle-ci hérite de la plupart des propriétés de la table parent. Le tableau ci-dessous indique quelles propriétés doivent correspondre et lesquelles peuvent différer.
Doivent correspondre : L'attachement d'une table fille avec une valeur différente pour ces propriétés renvoie une erreur. Pour éviter cela, créez les tables filles à l'aide de la commande CREATE TABLE LIKE, qui copie les paramètres de propriété du parent.
Peuvent différer : Si elles ne sont pas explicitement définies sur la table fille, celle-ci hérite de la valeur du parent. Si elles sont explicitement définies, la valeur de la table fille est appliquée.
Doivent inclure les colonnes indexées du parent : Les colonnes indexées de la table fille doivent constituer un sur-ensemble de celles du parent. Des colonnes indexées supplémentaires peuvent être ajoutées à la table fille.
| Catégorie | Propriété | Héritée du parent | Règle lors de l'attachement |
|---|---|---|---|
| Propriété de la table | orientation |
Oui | Doit correspondre |
| Propriété de la table | table_group |
Oui | Doit correspondre |
| Propriété de la table | time_to_live_in_seconds |
Oui | Peut différer |
| Index | Clé primaire | Oui | Doit correspondre |
| Index | distribution_key |
Oui | Doit correspondre |
| Index | clustering_key |
Oui | Doit correspondre |
| Index | event_time_column |
Oui | Doit correspondre |
| Index | bitmap_columns |
Oui | Peut différer |
| Index | dictionary_encoding_columns |
Oui | Peut différer |
| Index | binlog_level |
Oui | Doit correspondre |
| Index | proxima_vectors |
Oui | Doit correspondre |
| Contrainte de colonne | nullable (NOT NULL) |
Oui | Doit correspondre |
| Contrainte de colonne | Valeur par défaut | Oui | Doit correspondre |
Étapes suivantes
Partitionnement dynamique : créez et gérez automatiquement des tables filles selon des règles configurées, sans avoir à créer manuellement chaque partition au préalable.
ALTER PARTITION TABLE : modifiez les partitions après leur création.
DROP PARTITION TABLE : supprimez des tables partitionnées.