Impacto do CLUSTER no desempenho

8

Estou tentando otimizar meu banco de dados do Postgres 9.2 para acelerar as consultas com restrições de data.

Eu tenho uma timestampcoluna, mas na maioria das vezes estou pedindo um dia, então criei um índice com timestampa dateanálise:

CREATE INDEX foo_my_timestamp_idx
ON foo
USING btree
((my_timestamp::date) DESC);

Agora, para aumentar uma CLUSTER footabela de desempenho, use o índice acima:

CLUSTER foo USING foo_my_timestamp_idx;

De acordo com o manual do SQL-CLUSTER , a tabela

é reordenado fisicamente com base nas informações do índice

Gostaria de saber se há um impacto no desempenho para outras consultas usando uma PK de tabela (digamos id_foo). Existem desvantagens?

ilovkatie
fonte

Respostas:

10

Sim, pode haver desvantagens. Se outra consulta examinar um segmento de dados diferente não determinado pela data, poderá levar um impacto no desempenho se as linhas estiverem espalhadas por mais páginas de dados agora. Da mesma maneira que sua primeira consulta lucra. Isso depende completamente das informações que não estão na sua pergunta.

outras consultas usando um PK da tabela (digamos id_foo)

Isso pode ser qualquer coisa . Depende do que você tem e do que você consulta exatamente . A consulta de uma única linha não é afetada de qualquer maneira, mas várias linhas podem ser.

Esteja ciente de que CLUSTERreescreve a tabela em perfeitas condições, como VACUUM FULLfaz (remove tuplas mortas, compacta o tamanho físico da tabela, reescreve índices). Portanto, você poderá ver um efeito positivo imediato no desempenho da leitura, independentemente da ordem de classificação. (Muito parecido com o que você gostaria VACUUM FULL.)
Depois CLUSTER, você também pode executar uma planilha VACUUMna tabela para atualizar o mapa de visibilidade - o que pode permitir verificações apenas de índice.

Todos os benefícios do CLUSTERencolhimento com a frequência de gravação.

Além disso, se você tiver muitas atualizações na tabela, CLUSTERpoderá prejudicar o desempenho da gravação removendo a "sala de manobra" para atualizações HOT na mesma página de dados. Você pode combater esse efeito com uma FILLFACTORconfiguração abaixo de 100. Novamente, depende da localidade das linhas atualizadas, etc.

Palavras-chave:

De qualquer forma, eu provavelmente não indexaria e agruparia my_timestamp::date, mas my_timestampdiretamente. Nada perdido, algo ganho. O elenco é muito barato, mas ainda é mais barato não ser lançado. E o índice pode suportar mais consultas.

CREATE INDEX foo_my_timestamp_idx ON foo (my_timestamp);

Mesmo que um dateocupe apenas 4 bytes no disco e um timestampocupe 8 bytes, a diferença geralmente é perdida no preenchimento de alinhamento para o seu caso, e ambos os índices têm exatamente o mesmo tamanho.

A ordem de várias linhas no mesmo dia resultante do seu índice de expressão é arbitrária. Ainda pode haver dois carimbos de data e hora idênticos, mas com 6 dígitos fracionários, normalmente é muito improvável. Além disso, você obtém uma ordem determinística de linhas, que pode ter várias vantagens.

Eu também larguei a DESCpalavra-chave, já que o Postgres pode ler índices de trás para frente praticamente o mais rápido possível. (Porém, a ordem de classificação é importante para índices com várias colunas!)

Ao invés de:

SELECT * FROM foo
WHERE my_timestamp::date = '2016-07-25';

Agora você usaria:

SELECT * FROM foo
WHERE  my_timestamp >= '2016-07-25'  -- this is a timestamp literal now
WHERE  my_timestamp <  '2016-07-26';

Mesmo desempenho.

Se você não precisa do componente de tempo da coluna em tudo , converter a coluna para date...

Como reverter CLUSTER?

CLUSTERem uma única tabela pode ser revertida com ROLLBACKqualquer outro comando regular, desde que a transação não tenha sido confirmada.

No entanto, cito o manual :

CLUSTERsem nenhum parâmetro, reclusa todas as tabelas anteriormente agrupadas em cluster no banco de dados atual de propriedade do usuário que chama ou todas essas tabelas se chamadas por um superusuário. Esta forma de CLUSTERnão pode ser executada dentro de um bloco de transação.

Você sempre pode executar CLUSTERcom um índice diferente para alterar a ordem física das linhas mais uma vez.

Erwin Brandstetter
fonte
Resposta impressionante, preciso perguntar então, como 'reverter' CLUSTER? Preciso CLUSTERusar um PK agora?
Ilovkatie 28/07/16
@ilovkatie: eu adicionei um pouco como reverter.
Erwin Brandstetter