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 CLUSTER
reescreve a tabela em perfeitas condições, como VACUUM FULL
faz (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 VACUUM
na tabela para atualizar o mapa de visibilidade - o que pode permitir verificações apenas de índice.
Todos os benefícios do CLUSTER
encolhimento com a frequência de gravação.
Além disso, se você tiver muitas atualizações na tabela, CLUSTER
poderá 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 FILLFACTOR
configuraçã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_timestamp
diretamente. 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 date
ocupe apenas 4 bytes no disco e um timestamp
ocupe 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 DESC
palavra-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
?
CLUSTER
em uma única tabela pode ser revertida com ROLLBACK
qualquer outro comando regular, desde que a transação não tenha sido confirmada.
No entanto, cito o manual :
CLUSTER
sem 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 CLUSTER
não pode ser executada dentro de um bloco de transação.
Você sempre pode executar CLUSTER
com um índice diferente para alterar a ordem física das linhas mais uma vez.
CLUSTER
? PrecisoCLUSTER
usar um PK agora?