Який найшвидший спосіб отримати останній рядок із таблиці?


11

У мене є таблиця PostgreSQL Pricesіз стовпцями:

  • price (Десяткові десятки)
  • product_id (Int)

Є також created_atі updated_atстовпці.

Ціни оновлюються регулярно, і я зберігаю старі ціни в таблиці. Для даного товару остання ціна в таблиці - це поточна ціна.

Який найефективніший спосіб отримати останню ціну за конкретний товар:

  • Індекс product_idта запит останнього запису
  • Додайте третій стовпець active(булевий), щоб позначити останню ціну та створити складений індекс ( product_idі active)
  • Або щось інше?

4
Використання часткового індексу з умовою where active, ймовірно, допоможе ще більше отримати найновіший продукт.
a_horse_with_no_name

Відповіді:


11

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

За умови, що у вас є індекс у стовпці оновлений_at, і все, що вам потрібно, це отримати "конкретний продукт", як ви заявили, тоді я би зробив:

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

Але якби я не отримав бажаних результатів або якщо мені потрібно було отримати поточну ціну на багато продуктів, то я б спробував варіант додати активний стовпець і встановити його на N для всіх цін, окрім нової, коли робити оновлення цін, і тоді я створив би частковий індекс, де активний, як це запропонував a_horse_with_no_name. Я б поїхав туди лише в разі потреби, оскільки це додає шар складності оновлення попередніх цінових рядів, щоб не бути активними тощо.


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 підтримує матеріалізовані подання. Це хороший спосіб денормалізації даних, зберігаючи нормальну форму для запису та денормалізований вигляд для читання. Оновлення подання може бути спровоковано механізмом LISTEN / NOTIFY Postgres.


-1

У таблиці цін має бути стовпець дати та часу (з ефектом від). Користувач буде вводити його значення під час оновлення ціни. Після цього отримуйте лише значення з desc wef limit 1.


Це не відповідає на запитання.
Колін 'Харт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.