Qual é a maneira mais rápida de buscar a última linha de uma tabela?

11

Eu tenho uma tabela PostgreSQL,, Pricescom as colunas:

  • price (Decimal)
  • product_id (Int)

Há também created_ate updated_atcolunas.

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_ide consulta para o último registro
  • Adicione uma terceira coluna active(booleana) para marcar o preço mais recente e crie um índice composto ( product_ide active)
  • Ou alguma outra coisa?
Mike81
fonte
4
Usar um índice parcial com a condição where activeprovavelmente ajudaria ainda mais a recuperar o produto mais recente.
A_horse_with_no_name 16/02

Respostas:

11

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:

select *
from Prices
where product_id = ?
order by updated_at desc 
limit 1

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.

ETL
fonte
11
Esta consulta precisa de um índice ativado (product_id, updated_at)- ou ativado (product_id, updated_at DESC)- para ser eficiente. Não apenas por diante (updated_at).
precisa saber é o seguinte
5

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_pricetype pricena sua producttabela e criar um gatilho AFTER INSERT ON EACH ROWna sua pricetabela. 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.

greg
fonte