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.
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, useSORTKEY (column [, ...])em vez deORDER 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, useVACUUM SORT ONLY table_namepara ordenação composta eVACUUM REINDEX table_namepara 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 ( |
|
Versão do kernel para sintaxe |
Posterior a 20210326 |
|
Versão do kernel para sintaxe legada |
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:
Crie uma instância de 32 nós.
Grave 13 bilhões de linhas na tabela Lineitem.
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_shipdateversus 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 (
testetest_multi), cada uma com quatro colunas:id,num1,num2,valueChave de ordenação:
(id, num1, num2)em ambas as tabelas10 milhões de linhas por tabela
testordenada com ordenação composta (SORT test)test_multiordenada 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.