Какой самый быстрый способ получить последний ряд из таблицы?

11

У меня есть таблица PostgreSQL Prices, со столбцами:

  • price (Десятичный)
  • product_id (Int)

Есть также created_atи updated_atстолбцы.

Цены регулярно обновляются, и я держу старые цены в таблице. Для данного продукта последняя цена в таблице является текущей ценой.

Какой самый эффективный способ получить последнюю цену за конкретный товар:

  • Индекс product_idи запрос для последней записи
  • Добавьте третий столбец active(Boolean), чтобы отметить последнюю цену и создать составной индекс ( product_idи active)
  • Или что-то другое?
Mike81
источник
4
Использование частичного индекса с условием where active, вероятно, поможет еще больше получить последний продукт.
a_horse_with_no_name

Ответы:

11

Вам понадобится индекс для product_id независимо от решения.

Если у вас есть индекс для столбца updated_at, и все, что вам нужно, это выбрать «конкретный продукт», как вы заявили, тогда я бы сделал:

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

Но если я не получил желаемых результатов или мне нужно было получить текущую цену для многих продуктов, то я бы попробовал добавить активный столбец и установить его равным N для всех цен, кроме новой, при выполнении обновления цен, а затем я бы создал частичный индекс, где активно, как предложено a_horse_with_no_name. Я бы пошел туда, только если бы мне было нужно, так как это добавляет уровень сложности обновления предыдущих ценовых рядов, чтобы они не были активными и т. Д.

ETL
источник
1
Этот запрос должен быть включен (product_id, updated_at)или включен, (product_id, updated_at DESC)чтобы быть эффективным. Не только на (updated_at).
ypercubeᵀᴹ
5

Не зная остальной части вашей базы данных, вы можете позволить себе немного нестандартную форму для ускорения получения цен на товары (при условии, что для каждого товара существует одна цена).

Просто создайте новый столбец с именем last_priceтипа priceв вашей productтаблице и создайте триггер AFTER INSERT ON EACH ROWна вашей priceтаблице. Каждый раз, когда создается новая цена, обновляется соответствующий продукт с последней ценой. Таким образом, каждый раз, когда вы получаете продукт, вы также получаете его последнюю цену.

Начиная с версии 9.3, PostgreSQL поддерживает материализованные представления. Это хороший способ денормализовать данные, сохраняя нормальную форму для записи и денормализованный вид для чтения. Обновление представления может быть вызвано механизмом Postgres LISTEN / NOTIFY.

Greg
источник
-1

Вы должны иметь столбец wef даты и времени (с эффектом от) в таблице цен. Пользователь будет вводить его значение при обновлении цены. После этого получить только значение с ограничением 1 по умолчанию.

ahsanghalib
источник
Это не отвечает на вопрос.
Колин т Харт