Une table partitionnée stocke les données dans des emplacements physiques distincts selon une ou plusieurs colonnes. Lors de l'interrogation d'une table partitionnée, MaxCompute analyse uniquement les partitions correspondantes au lieu de la table entière, ce qui réduit les coûts de calcul et offre plus de flexibilité pour la gestion des données à grande échelle.
Options de partitionnement
MaxCompute propose deux approches de partitionnement :
|
Approche |
Méthode de création des partitions |
Cas d’usage recommandés |
|
Tables partitionnées standard |
Définissez une ou plusieurs colonnes comme clés de partition. |
Tables dont vous connaissez à l’avance la colonne de partition et sa plage de valeurs — par exemple, le partitionnement d’une table de ventes par |
|
Tables partitionnées automatiques |
Génération automatique des colonnes de partition en fonction du temps. |
Tables pour lesquelles vous souhaitez que les partitions soient créées automatiquement à mesure que les données arrivent, sans opérations |
Les tables partitionnées automatiques prennent en charge deux méthodes :
|
Méthode de partitionnement automatique |
Description |
|
Table partitionnée automatique basée sur une fonction de calcul temporel |
MaxCompute applique la fonction TRUNC_TIME à une colonne temporelle (DATE, DATETIME ou TIMESTAMP) et utilise le résultat comme valeur de partition. |
|
Table partitionnée automatique basée sur l’heure d’écriture des données |
MaxCompute applique la fonction TRUNC_TIME à l’heure d’ingestion, c’est-à-dire le moment où les données sont écrites dans le système. Cette approche est également appelée partitionnement par heure d’ingestion. |
Quand utiliser des tables partitionnées
Les tables partitionnées sont adaptées aux situations suivantes :
Votre table est volumineuse et les requêtes sont lentes : Les filtres de partition permettent à MaxCompute d’ignorer entièrement les partitions non correspondantes, éliminant ainsi les analyses complètes de la table.
Les modèles de requête se concentrent sur des plages horaires ou des catégories spécifiques : Plus votre filtre de partition est sélectif, plus le gain de performance est important.
Vous devez écrire ou supprimer des données à une granularité plus large que celle des lignes individuelles : Avec les tables partitionnées, vous pouvez cibler directement une partition spécifique — par exemple, supprimer les données du mois dernier en quelques secondes plutôt que d’exécuter des suppressions au niveau des lignes.
Vous souhaitez une expiration automatique des données : Les politiques de cycle de vie s’appliquent au niveau des partitions, ce qui permet un nettoyage sans intervention manuelle.
Recommandations relatives à la taille des partitions
La granularité des partitions a un impact direct sur les performances des requêtes et la charge système :
|
Contrainte |
Valeur |
Recommandation |
|
Nombre minimal de lignes par partition |
10 000 |
Les partitions contenant moins de lignes augmentent la charge liée aux métadonnées sans améliorer l’efficacité de l’élagage des partitions. |
|
Nombre maximal de partitions par table |
60 000 |
Évitez les conceptions qui génèrent un grand nombre de partitions très fines (par exemple, un partitionnement par seconde ou par ID utilisateur individuel). |
|
Nombre maximal de partitions par requête |
10 000 |
Si vos requêtes atteignent régulièrement cette limite, envisagez une granularité de partition plus large ou restructurez votre hiérarchie de partitionnement. |
Limites
Une table peut comporter au maximum 6 niveaux de partition.
Une table peut comporter au maximum 60 000 partitions.
Une seule requête peut analyser au maximum 10 000 partitions.
Les valeurs des clés de partition de type STRING ne peuvent pas contenir de caractères chinois.
Types de données pour les colonnes de partition
MaxCompute V2.0 prend en charge les types STRING, TINYINT, SMALLINT, INT, BIGINT et VARCHAR pour les colonnes de partition. MaxCompute stocke toutes les valeurs de partition en interne sous forme de STRING et convertit automatiquement les autres types. Pour éviter les erreurs liées aux types, définissez les colonnes de partition comme STRING.
La version de type de données MaxCompute 1.0 prend uniquement en charge STRING pour les colonnes de partition. La définition d’une colonne de partition comme BIGINT n’affecte que l’apparence du type dans le schéma de la table ; lors de tous les calculs et comparaisons, MaxCompute traite la colonne comme une STRING.
Cette distinction est importante pour l’élagage des partitions. Lorsqu’une clause WHERE compare une clé de partition STRING à une valeur BIGINT (sans guillemets), MaxCompute convertit implicitement les deux côtés en DOUBLE. Cette conversion implicite peut entraîner une perte de précision et interrompre l’élagage des partitions, ce qui force une analyse complète de la table même si vous avez spécifié une condition de partition. L’exemple suivant illustre ce comportement :
-- Create a partitioned table with a BIGINT partition column (MaxCompute 1.0 data type version)
CREATE TABLE parttest (a BIGINT) PARTITIONED BY (pt BIGINT);
-- Insert data
INSERT INTO parttest PARTITION(pt)(a, pt) VALUES (1, 1);
INSERT INTO parttest PARTITION(pt)(a, pt) VALUES (1, 10);
-- Query the rows where the value of pt is greater than or equal to 2.
-- The returned result is empty.
SELECT * FROM parttest WHERE pt >= '2';
Les types temporels et de date (DATE, DATETIME, TIMESTAMP) ne sont pas pris en charge comme types de colonnes de partition. Pour effectuer un partitionnement par temps, utilisez une table partitionnée automatique avec la fonction TRUNC_TIME.
Exemples de tables partitionnées standard
Les exemples suivants utilisent une table partitionnée à deux niveaux : le premier niveau est pt (date) et le second est region.
Étape 1 : Créez la table partitionnée.
-- Two-level partitioned table: first level by date (pt), second level by region
CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING, region STRING);
Étape 2 : Ajoutez des partitions et insérez des données.
ALTER TABLE src ADD PARTITION (pt='20170506', region='hangzhou') PARTITION (pt='20180101', region='shanghai');
INSERT INTO src PARTITION (pt='20170506', region='hangzhou') VALUES ('s1', 1), ('s2', 2), ('s3', 3);
INSERT INTO src PARTITION (pt='20180101', region='shanghai') VALUES ('c1', 4), ('c2', 5), ('c3', 6);
Étape 3 : Interrogez en utilisant des filtres de partition.
Utilisez des littéraux de chaîne pour les valeurs des clés de partition. MaxCompute localise directement les partitions correspondantes à l’aide des métadonnées et ignore toutes les données non correspondantes.
-- Correct: string literals trigger partition pruning
SELECT * FROM src WHERE pt='20170506' AND region='hangzhou';
Résultat :
+------------+-------------+------------+------------+
| shop_name | customer_id | pt | region |
+------------+-------------+------------+------------+
| s1 | 1 | 20170506 | hangzhou |
| s2 | 2 | 20170506 | hangzhou |
| s3 | 3 | 20170506 | hangzhou |
+------------+-------------+------------+------------+
Évitez de comparer une clé de partition STRING à un littéral numérique. MaxCompute convertit implicitement les deux côtés en DOUBLE, ce qui peut entraîner une perte de précision et contourner complètement l’élagage des partitions :
-- Incorrect: numeric literals cause an implicit cast to DOUBLE, breaking partition pruning
SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou;