Tous les produits
Search
Centre de documentation

AnalyticDB:Define table distribution

Dernière mise à jour :Aug 10, 2026

AnalyticDB for PostgreSQL répartit les données des tables sur les nœuds de calcul selon un schéma de distribution choisi lors de la création de la table. Le schéma et la clé de distribution sélectionnés influencent directement les performances des requêtes, l'équilibre des données et l'efficacité des jointures au sein du cluster.

Schémas de distribution

AnalyticDB for PostgreSQL prend en charge trois schémas de distribution :

CREATE TABLE <table_name> (...)
[ DISTRIBUTED BY (<column> [,..] ) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
Remarque

La version V4.3 ne prend en charge que la distribution par hachage et la distribution aléatoire. La distribution répliquée a été introduite dans la version V6.0.

Schéma Syntaxe Fonctionnement Cas d'utilisation
Distribution par hachage (par défaut) DISTRIBUTED BY (column, [...]) Attribue chaque ligne à un nœud de calcul en fonction de la valeur de hachage de la colonne de distribution. Les lignes partageant la même valeur de hachage sont stockées sur le même nœud. Si aucune clause DISTRIBUTED n'est spécifiée, la table utilise sa clé primaire comme clé de distribution. En l'absence de clé appropriée, le système bascule vers une distribution aléatoire. À privilégier pour la plupart des tables. Permet des jointures colocalisées et un filtrage au niveau des nœuds de calcul lorsque les requêtes exploitent la clé de distribution.
Distribution aléatoire DISTRIBUTED RANDOMLY Répartit les lignes uniformément sur tous les nœuds de calcul à l'aide d'un algorithme tournant (round-robin). Des lignes ayant la même valeur de hachage peuvent se retrouver sur des nœuds différents. À utiliser uniquement lorsqu'aucune colonne ne convient à la distribution par hachage. Ne prend pas en charge les jointures colocalisées ni le filtrage au niveau des nœuds de calcul.
Distribution répliquée DISTRIBUTED REPLICATED Stocke une copie complète de la table sur chaque nœud de calcul. Adaptée aux petites tables de référence fréquemment jointes avec de grandes tables. Améliore les performances des jointures.

Exemples :

-- Hash distribution
CREATE TABLE products (
    name        varchar(40),
    prod_id     integer,
    supplier_id integer
) DISTRIBUTED BY (prod_id);

-- Random distribution
CREATE TABLE random_stuff (
    things  text,
    doodads text,
    etc     text
) DISTRIBUTED RANDOMLY;

-- Replicated distribution
CREATE TABLE replicated_stuff (
    things  text,
    doodads text,
    etc     text
) DISTRIBUTED REPLICATED;

Impact de la distribution par hachage sur le routage des requêtes

Lorsqu'une requête filtre sur la clé de distribution, AnalyticDB for PostgreSQL la route uniquement vers les nœuds de calcul détenant les lignes correspondantes. Par exemple, la requête suivante est envoyée exclusivement au nœud contenant prod_id = 101, évitant ainsi un balayage complet de tous les nœuds :

SELECT * FROM products WHERE prod_id = 101;

Choisir une clé de distribution

Suivez ces étapes dans l'ordre pour sélectionner une clé de distribution efficace pour la distribution par hachage :

Étape 1 : Choisissez une colonne dont les données sont réparties uniformément.

Une répartition inégale des données provoque un déséquilibre (data skew) : certains nœuds de calcul se retrouvent avec beaucoup plus de lignes que d'autres, ce qui augmente leur charge et ralentit les requêtes. Évitez les colonnes booléennes, temporelles ou de date, qui présentent généralement une faible cardinalité et génèrent des distributions déséquilibrées.

Étape 2 : Choisissez une colonne fréquemment utilisée dans les conditions de jointure.

Lorsque la clé de jointure correspond à la clé de distribution, AnalyticDB for PostgreSQL effectue une jointure colocalisée : chaque nœud de calcul joint uniquement ses données locales, sans transfert de données entre les nœuds.

Si la clé de jointure diffère de la clé de distribution, le moteur de requête doit effectuer un mouvement de redistribution ou un mouvement de diffusion avant la jointure, deux opérations qui engendrent une surcharge réseau plus importante qu'une jointure colocalisée.

Collocated joinRedistributed joinBroadcast join

Étape 3 : Choisissez une colonne fréquemment utilisée comme filtre de requête.

Le filtrage sur la clé de distribution permet à AnalyticDB for PostgreSQL d'ignorer les nœuds de calcul ne contenant pas les lignes pertinentes, réduisant ainsi le volume de données analysé par requête.

Étape 4 : Privilégiez une clé unique.

Une clé unique, telle que la clé primaire, maximise la cardinalité et garantit une répartition homogène des lignes sur les nœuds. Si votre table possède une clé primaire, utilisez-la comme point de départ.

Étape 5 : Envisagez une clé de distribution composite.

Si aucune colonne unique ne satisfait les critères ci-dessus, combinez deux colonnes ou plus pour former la clé de distribution :

CREATE TABLE t1 (c1 int, c2 int) DISTRIBUTED BY (c1, c2);

Limites des clés de distribution

  • Les colonnes de la clé de distribution ne peuvent pas être mises à jour. Pour modifier la distribution, utilisez ALTER TABLE ... SET DISTRIBUTED BY.

  • La clé de distribution doit faire partie de la clé primaire ou d'une clé unique. L'exemple suivant échoue car c2 (la clé de distribution) n'est pas incluse dans la clé primaire c1 :

    CREATE TABLE t1 (c1 int, c2 int, PRIMARY KEY (c1)) DISTRIBUTED BY (c2);
    -- ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatible
  • Les colonnes de type géométrique ou de type de données personnalisé ne peuvent pas servir de clés de distribution.

Résoudre les problèmes de déséquilibre des données

Un déséquilibre des données (data skew) survient lorsqu'un ou plusieurs nœuds de calcul stockent significativement plus de lignes que les autres. Une cause fréquente est le choix d'une colonne à faible cardinalité, comme un indicateur de statut ou une colonne de date où de nombreuses lignes partagent la même valeur. Toutes les lignes ayant cette valeur sont hachées vers le même nœud, ce qui le surcharge tandis que les autres restent sous-utilisés.

Pour détecter un déséquilibre des données, interrogez le nombre de lignes par nœud de calcul :

SELECT gp_segment_id, count(1)
FROM t1
GROUP BY 1
ORDER BY 2 DESC;

 gp_segment_id | count
---------------+--------
             2 | 131191
             0 |     72
             1 |     68
(3 rows)

La sortie ci-dessus révèle un déséquilibre sévère : le nœud 2 contient presque toutes les données.

Pour corriger le déséquilibre des données, modifiez la clé de distribution pour utiliser une colonne dont les valeurs sont plus uniformément réparties :

ALTER TABLE t1 SET DISTRIBUTED BY (c2);

Après la redistribution, les données sont réparties uniformément sur tous les nœuds de calcul.