Получение последней цены из вашей первой таблицы должно быть быстрым, если у вас правильный индекс. Построение правильного индекса для вашей таблицы ProductPrice - это гораздо лучшее решение вашей проблемы, чем попытка сохранить отдельную таблицу.
Ваш запрос для получения последних цен будет выглядеть следующим образом.
SELECT p.product_id, p.prod_date, p.price
FROM ProductPrice p
JOIN (
SELECT product_id, MAX(prod_date) latest_prod_date
FROM ProductPrice
GROUP BY product_id
) m ON p.product_id = m.product_id
AND p.prod_date = m.latest_prod_date
WHERE p.product_id = ????
Это работает, потому что подзапрос ищет последнюю дату продукта для каждого продукта. Затем он использует эту информацию, чтобы найти нужную строку в таблице, чтобы показать вам.
Если вы создадите составной индекс для (product_id, prod_date, price)
, этот запрос будет выполняться почти чудесным образом. Это связано с тем, что планировщик запросов может найти правильный элемент индекса за O (log n) или лучше.
Вы можете сделать его в таком виде:
CREATE OR REPLACE VIEW ProductPriceLatest AS
SELECT p.product_id, p.prod_date, p.price
FROM ProductPrice p
JOIN (
SELECT product_id, MAX(prod_date) latest_prod_date
FROM ProductPrice
GROUP BY product_id
) m ON p.product_id = m.product_id
AND p.prod_date = m.latest_prod_date;
Затем вы можете использовать такой вид:
SELECT * FROM ProductPriceLatest WHERE product_id = ???
и получите такую же высокую производительность.
Это проще, менее подвержено ошибкам и так же быстро, как создание отдельной таблицы и ее обслуживание. Кстати, жаргон СУБД для таблицы, которую вы предлагаете создать, - материализованное представление.