Eu tenho uma consulta simples em um banco de dados Postgres 15. Sem junções ou outras coisas sofisticadas:
selecione * da minha_tabela onde col='val'
O objetivo é agilizar a consulta. Eu diria que preciso de um índice, mas os valores col
não são únicos. Existe alguma maneira de especificar algo como índice não exclusivo ou qualquer outra maneira de acelerá-lo usando apenas a estrutura da tabela ?
Presumo que todos os ajustes de memória/cache/hardware já tenham sido feitos.
Otimizar:
Especificações
A coluna
col
não éUNIQUE
. Mas, desde que a cardinalidade na coluna não seja extremamente baixa (o que significa que seu filtro é seletivo o suficiente), um índice básico de árvore B ajuda (muito):Se o desempenho desse
SELECT
for o seu objetivo principal,CLUSTER
a tabela que usa o referido índice. Ver:Você realmente precisa selecionar a linha inteira (
SELECT *
) ou uma seleção de colunas seria suficiente?Fundamentos
Armazenamento: mais rápido é obviamente melhor.
RAM: mais é obviamente melhor - até que você tenha o suficiente para que toda a tabela possa residir no cache o tempo todo. Então o armazenamento perde sua relevância para sua
SELECT
consulta.CPU: mais rápido é obviamente melhor - mas principalmente apenas quando o sistema está próximo da capacidade, já que a CPU normalmente não é o gargalo para uma
SELECT
consulta simples.Carga simultânea: menos na mesma tabela/banco de dados/servidor é obviamente melhor. (Os escritores não bloqueiam os leitores no Postgres. Ainda assim, a atividade de gravação pode impedir o desempenho de leitura de várias maneiras.)
Configuração do servidor: a RAM deve ser alocada corretamente, as configurações de custo e as estatísticas da coluna devem ser válidas.
Definição da tabela: escolha os tipos de dados corretos na sequência otimizada. Ver: