Todos os produtos
Search
Central de documentação

AnalyticDB:Acelere consultas em tabelas orientadas a colunas usando chaves de ordenação e índices aproximados

Última atualização: Jun 27, 2026

As chaves de ordenação permitem que o AnalyticDB for PostgreSQL ignore grandes porções de blocos de disco durante varreduras de tabelas, reduzindo drasticamente o tempo de resposta para consultas com restrições de intervalo. Esse recurso aplica-se a tabelas orientadas a colunas e somente anexáveis, sendo mais eficaz quando as consultas filtram consistentemente um conjunto previsível de colunas.

Importante

Este recurso aplica-se a:

  • Instâncias no modo reservado com versão de kernel posterior a 20200826

  • Instâncias no modo elástico com versão de kernel posterior a 20200906

Como funciona

O AnalyticDB for PostgreSQL armazena dados orientados a colunas em blocos de disco. Para cada bloco, o banco de dados registra os valores mínimo e máximo de cada coluna — uma estrutura chamada índice de conjunto aproximado. Quando uma consulta inclui um predicado de intervalo na cláusula WHERE, o processador compara esse predicado aos valores mínimo e máximo de cada bloco e ignora qualquer bloco fora do intervalo.

Quanto maior a correlação entre os dados e a chave de ordenação, mais blocos serão eliminados. Por exemplo, se uma tabela contém sete anos de dados ordenados por data e uma consulta filtra um único mês, apenas 1/(7 × 12) dos dados precisam ser varridos — eliminando cerca de 98,8% dos blocos de disco. Sem a ordenação, todos os blocos podem ser varridos.

O AnalyticDB for PostgreSQL suporta dois métodos de ordenação:

Método

Comportamento

Mais indicado para

Ordenação composta

Ordena os dados como uma tupla ordenada de todas as colunas da chave de ordenação, priorizando a coluna principal

Consultas que filtram pela primeira coluna (principal) da chave de ordenação

Ordenação intercalada

Atribui peso igual a cada coluna na chave de ordenação

Consultas que filtram por qualquer subconjunto de colunas da chave de ordenação, incluindo colunas não principais

Para uma comparação detalhada de desempenho, consulte Comparação de desempenho: ordenação composta versus intercalada.

Quando usar chaves de ordenação

As chaves de ordenação beneficiam tabelas que atendem a todos os critérios a seguir:

  • Consultas seletivas: as consultas filtram um pequeno subconjunto de linhas usando um predicado de intervalo ou igualdade na cláusula WHERE.

  • Colunas de filtro consistentes: uma alta porcentagem das consultas filtra pela mesma coluna ou conjunto de colunas.

  • Tabelas de grande porte: o ganho de desempenho aumenta conforme o tamanho da tabela. As chaves de ordenação têm maior impacto em tabelas com centenas de milhões de linhas ou mais.

As chaves de ordenação adicionam sobrecarga de manutenção: após carregar os dados, ordene explicitamente a tabela e reordene-a periodicamente à medida que novos dados se acumulam. Se sua carga de trabalho tiver uma alta taxa de escrita com consultas ad-hoc pouco frequentes, o custo de manutenção pode superar o benefício de velocidade nas consultas.

Escolha um método de ordenação

Use estas diretrizes para selecionar o método adequado aos seus padrões de consulta:

  • Se a maioria das consultas filtra pela coluna principal da chave de ordenação, use a ordenação composta. Ela produz os tempos de resposta mais rápidos para predicados na coluna principal. Observe que a reordenação com ordenação composta leva mais tempo do que com a ordenação intercalada, pois realiza análises adicionais nos dados.

  • Se as consultas filtram por colunas não principais ou por subconjuntos arbitrários da chave de ordenação, use a ordenação intercalada. Uma chave de ordenação intercalada suporta até oito colunas. Quanto mais colunas da chave de ordenação uma consulta referenciar, maior será o benefício de desempenho.

  • Em caso de dúvida, comece com a ordenação composta. É a escolha mais simples e oferece melhor desempenho quando as consultas possuem uma coluna de filtro principal clara.

Defina uma chave de ordenação ao criar uma tabela

Use a cláusula ORDER BY em CREATE TABLE para definir uma ou mais colunas como chave de ordenação. A tabela deve usar armazenamento orientado a colunas e somente anexável (APPENDONLY=true, ORIENTATION=column).

create table test(date text, time text, open float, high float, low float, volume int)
with(APPENDONLY=true,ORIENTATION=column) ORDER BY (volume);

Sintaxe completa:

CREATE [[GLOBAL | LOCAL] {TEMPORARY | TEMP}] TABLE table_name (
    column_name data_type [, ...]
)
[ DISTRIBUTED BY (column [, ...]) | DISTRIBUTED RANDOMLY ]
[ ORDER BY (column [, ...]) ]
Se a versão do seu kernel for anterior a 20210326, use SORTKEY (column [, ...]) em vez de ORDER BY (column [, ...]) para definir a chave de ordenação.

Ordene uma tabela

Definir uma chave de ordenação não classifica os dados automaticamente. Após gravar dados na tabela, execute um comando de ordenação para aplicar a ordem de classificação e construir o índice de conjunto aproximado.

Ordenação composta:

SORT table_name;

Ordenação intercalada:

MULTISORT table_name;
Se a versão do seu kernel for anterior a 20210326, use VACUUM SORT ONLY table_name para ordenação composta e VACUUM REINDEX table_name para ordenação intercalada.

À medida que novas linhas são adicionadas a uma tabela ordenada, dados não classificados se acumulam e a filtragem por conjunto aproximado torna-se menos eficaz. Execute SORT ou MULTISORT periodicamente para manter o desempenho das consultas.

Modifique uma chave de ordenação

Para alterar a chave de ordenação de uma tabela orientada a colunas existente:

ALTER TABLE table_name SET ORDER BY (column [, ...]);

Esta instrução atualiza apenas o catálogo — ela não ordena os dados. Execute SORT table_name em seguida para aplicar a nova ordem de classificação.

Exemplo:

ALTER TABLE test SET ORDER BY (high, low);
SORT test;
Se a versão do seu kernel for anterior a 20210326, use ALTER TABLE test SET SORTKEY (high, low) .

Limites

Item

Limite

Máximo de colunas na chave de ordenação (ordenação intercalada)

8

Tipo de armazenamento da tabela

Apenas orientado a colunas e somente anexável (APPENDONLY=true, ORIENTATION=column)

Versão do kernel para sintaxe ORDER BY / SORT / MULTISORT

Posterior a 20210326

Versão do kernel para sintaxe legada SORTKEY / VACUUM SORT ONLY / VACUUM REINDEX

20210326 ou anterior

Comparação de desempenho: ordenação composta versus intercalada

Benchmark TPC-H: impacto da chave de ordenação em consultas de intervalo

Esta seção demonstra como a ordenação composta melhora o desempenho de consultas para índices de conjunto aproximado em comparação com uma varredura completa de tabela, usando uma tabela Lineitem do TPC-H que armazena sete anos de dados.

Esta implementação do TPC é derivada do TPC Benchmark e não é comparável aos resultados publicados do TPC Benchmark, pois esta implementação não atende a todos os requisitos do TPC Benchmark.

Configuração do teste:

  1. Crie uma instância de 32 nós.

  2. Grave 13 bilhões de linhas na tabela Lineitem.

  3. Consulte dados no intervalo de tempo de 1997-09-01 a 1997-09-30, comparando os resultados quando os dados estão ordenados por l_shipdate versus não ordenados.

Composta versus intercalada: desempenho em diferentes formatos de consulta

O exemplo a seguir usa duas tabelas com dados e chaves de ordenação idênticos para mostrar como os dois métodos se comportam em diferentes formatos de consulta.

Configuração do teste:

  • Duas tabelas (test e test_multi), cada uma com quatro colunas: id, num1, num2, value

  • Chave de ordenação: (id, num1, num2) em ambas as tabelas

  • 10 milhões de linhas por tabela

  • test ordenada com ordenação composta (SORT test)

  • test_multi ordenada com ordenação intercalada (MULTISORT test_multi)

Crie as tabelas e insira os dados:

CREATE TABLE test (id int, num1 int, num2 int, value varchar)
WITH (APPENDONLY=TRUE, ORIENTATION=column)
DISTRIBUTED BY (id)
ORDER BY (id, num1, num2);

CREATE TABLE test_multi (id int, num1 int, num2 int, value varchar)
WITH (APPENDONLY=TRUE, ORIENTATION=column)
DISTRIBUTED BY (id)
ORDER BY (id, num1, num2);

INSERT INTO test (id, num1, num2, value)
SELECT g,
    (random() * 10000000)::int,
    (random() * 10000000)::int,
    (ARRAY['foo', 'bar', 'baz', 'quux', 'boy', 'girl', 'mouse', 'child', 'phone'])[floor(random() * 10 + 1)]
FROM generate_series(1, 10000000) AS g;

INSERT INTO test_multi SELECT * FROM test;

SORT test;
MULTISORT test_multi;

Desempenho de consultas pontuais

Todas as três consultas filtram pelas colunas da chave de ordenação, mas em posições diferentes.

-- Q1: filter on the leading column (id)
SELECT * FROM test WHERE id = 100000;
SELECT * FROM test_multi WHERE id = 100000;

-- Q2: filter on the second column (num1)
SELECT * FROM test WHERE num1 = 8766963;
SELECT * FROM test_multi WHERE num1 = 8766963;

-- Q3: filter on the second and third columns (num1, num2)
SELECT * FROM test WHERE num1 = 100000 AND num2 = 2904114;
SELECT * FROM test_multi WHERE num1 = 100000 AND num2 = 2904114;

Consulta

Colunas de filtro

Ordenação composta

Ordenação intercalada

Q1

Coluna principal (id)

0,026s

0,55s

Q2

Segunda coluna (num1)

3,95s

0,42s

Q3

Segunda + terceira colunas (num1, num2)

4,21s

0,071s

Desempenho de consultas de intervalo

-- Q1: range filter on the leading column (id)
SELECT count(*) FROM test WHERE id > 5000 AND id < 100000;
SELECT count(*) FROM test_multi WHERE id > 5000 AND id < 100000;

-- Q2: range filter on the second column (num1)
SELECT count(*) FROM test WHERE num1 > 5000 AND num1 < 100000;
SELECT count(*) FROM test_multi WHERE num1 > 5000 AND num1 < 100000;

-- Q3: range filter on the second and third columns (num1, num2)
SELECT count(*) FROM test WHERE num1 > 5000 AND num1 < 100000 AND num2 < 100000;
SELECT count(*) FROM test_multi WHERE num1 > 5000 AND num1 < 100000 AND num2 < 100000;

Consulta

Colunas de filtro

Ordenação composta

Ordenação intercalada

Q1

Coluna principal (id)

0,07s

0,44s

Q2

Segunda coluna (num1)

3,35s

0,28s

Q3

Segunda + terceira colunas (num1, num2)

3,64s

0,047s

Principais conclusões

  • A ordenação composta vence na coluna principal. Os resultados da Q1 mostram que a ordenação composta tem um tempo de resposta menor do que a ordenação intercalada quando o filtro visa a primeira coluna da chave de ordenação.

  • A ordenação intercalada vence em colunas não principais. Os resultados da Q2 e Q3 mostram que a ordenação intercalada supera significativamente a ordenação composta quando as consultas ignoram a coluna principal.

  • A ordenação intercalada escala com o número de colunas. Quanto mais colunas da chave de ordenação uma consulta referenciar, maior será a vantagem de desempenho da ordenação intercalada (Q3 vs. Q2).

Este teste usa 10 milhões de linhas — um tamanho modesto para o AnalyticDB for PostgreSQL. A diferença de desempenho entre os dois métodos é mais pronunciada em tabelas maiores.