Eu tenho uma tabela PostgreSQL,, Prices
com as colunas:
price
(Decimal)product_id
(Int)
Há também created_at
e updated_at
colunas.
Os preços são atualizados regularmente e mantenho os preços antigos na tabela. Para um determinado produto, o último preço na tabela é o preço atual.
Qual é a maneira mais eficiente de obter o último preço de um produto específico:
- Índice
product_id
e consulta para o último registro - Adicione uma terceira coluna
active
(booleana) para marcar o preço mais recente e crie um índice composto (product_id
eactive
) - Ou alguma outra coisa?
postgresql
physical-design
Mike81
fonte
fonte
where active
provavelmente ajudaria ainda mais a recuperar o produto mais recente.Respostas:
Você precisará de um índice em product_id, independentemente da solução.
Desde que você tenha um índice na coluna updated_at, e tudo que você precisa é buscar "um produto específico", como você declarou, então eu faria:
Mas se eu não obtivesse os resultados desejados ou precisasse obter o preço atual para muitos produtos, tentaria adicionar uma coluna ativa e defini-la como N para todos os preços que não o novo ao fazer atualizações dos preços e, em seguida, eu criaria um índice parcial onde ativo, conforme sugerido por a_horse_with_no_name. Eu iria lá apenas se fosse necessário, pois adiciona uma camada de complexidade da atualização de linhas de preços anteriores para não estar ativa, etc.
fonte
(product_id, updated_at)
- ou ativado(product_id, updated_at DESC)
- para ser eficiente. Não apenas por diante(updated_at)
.Sem o conhecimento do restante do seu banco de dados, você pode pagar um pouco de forma não normal para acelerar a busca de preços de produtos (supondo que exista um preço para cada item).
Basta criar uma nova coluna denominada
last_price
typeprice
na suaproduct
tabela e criar um gatilhoAFTER INSERT ON EACH ROW
na suaprice
tabela. Sempre que um novo preço é criado, ele atualiza o produto relacionado com o preço mais recente. Dessa forma, toda vez que você busca um produto, também busca seu último preço.Desde a versão 9.3, o PostgreSQL suporta visualizações materializadas. É uma boa maneira de desnormalizar os dados, mantendo um formulário normal para gravação e exibição desnormalizada para leitura. A atualização da visualização pode ser acionada pelo mecanismo LISTEN / NOTIFY do Postgres.
fonte