Todos os produtos
Search
Central de documentação

AnalyticDB:Definir distribuição de tabela

Última atualização: Jun 27, 2026

O AnalyticDB for PostgreSQL distribui os dados da tabela entre os nós de computação conforme o esquema definido na criação da tabela. O esquema e a chave de distribuição escolhidos afetam diretamente o desempenho das consultas, o equilíbrio dos dados e a eficiência das junções no cluster.

Esquemas de distribuição

O AnalyticDB for PostgreSQL oferece três esquemas de distribuição:

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

A versão V4.3 suporta apenas distribuição por hash e distribuição aleatória. A distribuição replicada foi introduzida na versão V6.0.

Esquema

Sintaxe

Funcionamento

Quando usar

Distribuição por hash (padrão)

DISTRIBUTED BY (column, [...])

Atribui cada linha a um nó de computação com base no valor de hash da coluna de distribuição. Linhas com o mesmo valor de hash vão para o mesmo nó. Sem a cláusula DISTRIBUTED, a tabela usa a chave primária como chave de distribuição. Na ausência de uma chave adequada, o sistema adota a distribuição aleatória.

Use na maioria das tabelas. Permite junções colocalizadas e filtragem por nó de computação quando as consultas utilizam a chave de distribuição.

Distribuição aleatória

DISTRIBUTED RANDOMLY

Distribui as linhas uniformemente entre todos os nós de computação mediante algoritmo round-robin. Linhas com o mesmo valor de hash podem ficar em nós diferentes.

Use apenas quando nenhuma coluna for adequada para distribuição por hash. Não suporta junções colocalizadas nem filtragem por nó de computação.

Distribuição replicada

DISTRIBUTED REPLICATED

Armazena uma cópia completa da tabela em cada nó de computação.

Use para tabelas de consulta pequenas frequentemente unidas a tabelas grandes. Melhora o desempenho das junções.

Exemplos:

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

Como a distribuição por hash afeta o roteamento de consultas

Ao filtrar pela chave de distribuição, o AnalyticDB for PostgreSQL encaminha a consulta apenas aos nós de computação que contêm as linhas correspondentes. Por exemplo, a consulta abaixo vai somente ao nó com prod_id = 101, evitando varredura em todos os nós:

SELECT * FROM products WHERE prod_id = 101;

Escolha uma chave de distribuição

Siga estas etapas para selecione uma chave de distribuição eficaz para distribuição por hash:

Etapa 1: Selecione uma coluna com dados distribuídos uniformemente.

A distribuição desigual causa distorção de dados (data skew): alguns nós de computação armazenam muito mais linhas que outros, o que aumenta a carga e lentifica as consultas. Evite colunas booleanas, de hora e de data, pois geralmente têm baixa cardinalidade e geram distribuições distorcidas.

Etapa 2: Prefira uma coluna usada frequentemente em condições de junção.

Se a chave de junção corresponder à chave de distribuição, o AnalyticDB for PostgreSQL executa uma junção colocalizada: cada nó de computação processa apenas seus dados locais, sem movimentação de dados entre nós.

Caso a chave de junção difira da chave de distribuição, o mecanismo de consulta precisa executar uma movimentação com redistribuição ou uma movimentação com broadcast antes de unir os dados. Ambas as operações geram sobrecarga de rede maior que a junção colocalizada.

Collocated joinRedistributed joinBroadcast join

Etapa 3: Opte por uma coluna usada frequentemente como filtro de consulta.

Filtrar pela chave de distribuição permite ao AnalyticDB for PostgreSQL ignorar nós de computação sem as linhas relevantes, reduzindo a quantidade de dados verificados por consulta.

Etapa 4: Dê preferência a uma chave única.

Uma chave única, como a chave primária, maximiza a cardinalidade e garante a distribuição uniforme das linhas entre os nós. Se a tabela tiver chave primária, use-a como ponto de partida.

Etapa 5: Considere uma chave de distribuição composta.

Se nenhuma coluna isolada atender aos critérios acima, combine duas ou mais colunas como chave de distribuição:

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

Limites das chaves de distribuição

  • Não é possível atualizar colunas da chave de distribuição. Para redefinir a distribuição, use ALTER TABLE ... SET DISTRIBUTED BY.

  • A chave de distribuição deve integrar a chave primária ou uma chave única. O exemplo a seguir falha porque c2 (chave de distribuição) não consta na chave primária c1:

    CREATE TABLE t1 (c1 int, c2 int, PRIMARY KEY (c1)) DISTRIBUTED BY (c2);
    -- ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatible
  • Colunas com tipos de dados geométricos ou personalizados não podem servir como chaves de distribuição.

Solucionar problemas de distorção de dados

A distorção de dados ocorre quando um ou mais nós de computação armazenam significativamente mais linhas que os demais. Geralmente, isso resulta da escolha de uma coluna de baixa cardinalidade, como status ou data, em que muitas linhas compartilham o mesmo valor. O hash direciona todas as linhas com esse valor para o mesmo nó, sobrecarregando-o enquanto os outros permanecem subutilizados.

Para detectar distorção de dados, consulte a contagem de linhas por nó de computação:

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)

A saída acima mostra uma distorção severa: o nó 2 armazena quase todos os dados.

Para corrigir a distorção de dados, altere a chave de distribuição para uma coluna com valores distribuídos de forma mais uniforme:

ALTER TABLE t1 SET DISTRIBUTED BY (c2);

Após a redistribuição, os dados se espalham uniformemente por todos os nós de computação.