Todos los productos
Search
Centro de documentos

AnalyticDB:Definir la distribución de tablas

Última actualización: Sep 04, 2026

AnalyticDB for PostgreSQL distribuye los datos de las tablas entre los nodos de cómputo según el esquema de distribución que usted elija al crear la tabla. El esquema y la clave de distribución que seleccione afectan directamente el rendimiento de las consultas, el equilibrio de los datos y la eficiencia de las uniones en todo su clúster.

Esquemas de distribución

AnalyticDB for PostgreSQL admite tres esquemas de distribución:

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

La versión V4.3 solo admite distribución por hash y distribución aleatoria. La distribución replicada se introdujo en la V6.0.

Esquema

Sintaxis

Funcionamiento

Cuándo utilizarlo

Distribución por hash (predeterminado)

DISTRIBUTED BY (column, [...])

Asigna cada fila a un nodo de cómputo según el valor hash de la columna de distribución. Las filas con el mismo valor hash se envían al mismo nodo. Si no se especifica una cláusula DISTRIBUTED, la tabla utiliza su clave primaria como clave de distribución. Si no existe una clave adecuada, se recurre a la distribución aleatoria.

Úselo para la mayoría de las tablas. Permite uniones colocalizadas y filtrado por nodo de cómputo cuando las consultas utilizan la clave de distribución.

Distribución aleatoria

DISTRIBUTED RANDOMLY

Distribuye las filas uniformemente entre todos los nodos de cómputo mediante un algoritmo round-robin. Las filas con el mismo valor hash pueden terminar en nodos diferentes.

Utilícelo solo cuando ninguna columna sea adecuada para la distribución por hash. No admite uniones colocalizadas ni filtrado por nodo de cómputo.

Distribución replicada

DISTRIBUTED REPLICATED

Almacena una copia completa de la tabla en cada nodo de cómputo.

Apropiado para tablas de búsqueda pequeñas que se unen frecuentemente con tablas grandes. Mejora el rendimiento de las uniones.

Ejemplos:

-- 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;

Cómo afecta la distribución por hash al enrutamiento de consultas

Cuando una consulta filtra por la clave de distribución, AnalyticDB for PostgreSQL enruta la consulta únicamente a los nodos de cómputo que contienen las filas coincidentes. Por ejemplo, la siguiente consulta se envía solo al nodo que contiene prod_id = 101, en lugar de examinar todos los nodos:

SELECT * FROM products WHERE prod_id = 101;

Elegir una clave de distribución

Siga estos pasos para seleccionar una clave de distribución eficaz para la distribución por hash:

Paso 1: Elija una columna con datos distribuidos uniformemente.

Una distribución desigual de los datos provoca sesgo de datos: algunos nodos de cómputo terminan con muchas más filas que otros, lo que aumenta su carga y ralentiza las consultas. Evite columnas booleanas, de hora y de fecha, ya que suelen tener baja cardinalidad y generan distribuciones sesgadas.

Paso 2: Elija una columna utilizada frecuentemente en condiciones de unión.

Cuando la clave de unión coincide con la clave de distribución, AnalyticDB for PostgreSQL realiza una unión colocalizada: cada nodo de cómputo une solo sus datos locales, sin movimiento de datos entre nodos.

Si la clave de unión difiere de la clave de distribución, el motor de consultas debe ejecutar un movimiento de redistribución o un movimiento de difusión antes de la unión; ambos implican una mayor sobrecarga de red que una unión colocalizada.

Collocated joinRedistributed joinBroadcast join

Paso 3: Elija una columna utilizada frecuentemente como filtro de consulta.

Filtrar por la clave de distribución permite que AnalyticDB for PostgreSQL omita los nodos de cómputo que no contienen las filas relevantes, lo que reduce la cantidad de datos examinados por consulta.

Paso 4: Prefiera una clave única.

Una clave única, como la clave primaria, maximiza la cardinalidad y garantiza que las filas se distribuyan uniformemente entre los nodos. Si su tabla tiene una clave primaria, utilícela como punto de partida.

Paso 5: Considere una clave de distribución compuesta.

Si ninguna columna individual cumple con los criterios anteriores, combine dos o más columnas como clave de distribución:

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

Límites de las claves de distribución

  • Las columnas de la clave de distribución no se pueden actualizar. Para reasignar la distribución, use ALTER TABLE ... SET DISTRIBUTED BY.

  • La clave de distribución debe formar parte de la clave primaria o de una clave única. El siguiente ejemplo falla porque c2 (la clave de distribución) no está incluida en la clave primaria c1:

    CREATE TABLE t1 (c1 int, c2 int, PRIMARY KEY (c1)) DISTRIBUTED BY (c2);
    -- ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatible
  • No se pueden usar columnas de tipo geometry ni tipos de datos personalizados como claves de distribución.

Solucionar problemas de sesgo de datos

El sesgo de datos ocurre cuando uno o más nodos de cómputo almacenan significativamente más filas que los demás. Una causa común es elegir una columna de baja cardinalidad, como una columna de estado o de fecha donde muchas filas comparten el mismo valor. Todas las filas con ese valor se asignan mediante hash al mismo nodo, lo que lo sobrecarga mientras los demás permanecen subutilizados.

Para detectar el sesgo de datos, consulte el recuento de filas por nodo de cómputo:

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)

El resultado anterior muestra un sesgo severo: el nodo 2 contiene casi todos los datos.

Para corregir el sesgo de datos, cambie la clave de distribución a una columna con valores distribuidos más uniformemente:

ALTER TABLE t1 SET DISTRIBUTED BY (c2);

Después de la redistribución, los datos se distribuyen uniformemente entre todos los nodos de cómputo.