Jaki jest najszybszy sposób na pobranie ostatniego wiersza ze stołu?

11

Mam tabelę PostgreSQL Pricesz kolumnami:

  • price (Dziesiętny)
  • product_id (Int)

Istnieją również created_ati updated_atkolumny.

Ceny są regularnie aktualizowane i trzymam stare ceny w tabeli. Dla danego produktu ostatnia cena w tabeli jest ceną bieżącą.

Jaki jest najbardziej efektywny sposób uzyskania ostatniej ceny za konkretny produkt:

  • Indeks product_idi zapytanie dotyczące ostatniego rekordu
  • Dodaj trzecią kolumnę active(wartość logiczna), aby zaznaczyć najnowszą cenę i utworzyć indeks złożony ( product_idi active)
  • Albo coś innego?
Mike81
źródło
4
Użycie częściowego indeksu z warunkiem where activeprawdopodobnie jeszcze bardziej pomogłoby uzyskać najnowszy produkt.
a_horse_w_no_name

Odpowiedzi:

11

Będziesz potrzebował indeksu na id_produktu niezależnie od rozwiązania.

Pod warunkiem, że masz indeks w kolumnie updated_at, a wszystko, czego potrzebujesz, to pobrać „określony produkt”, jak powiedziałeś, to zrobiłbym:

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

Ale jeśli nie uzyskałem oczekiwanych rezultatów lub gdybym musiał uzyskać bieżącą cenę dla wielu produktów, wówczas spróbowałbym dodać opcję aktywnej kolumny i ustawić ją na N dla wszystkich cen innych niż nowa, robiąc to aktualizacje cen, a następnie utworzyłbym częściowy indeks, w którym byłby aktywny, jak sugeruje a_horse_w_no_name. Wybrałbym się tam tylko, gdybym tego potrzebował, ponieważ dodaje to warstwy złożoności aktualizacji poprzednich wierszy cen, aby nie były aktywne itp.

ETL
źródło
1
To zapytanie wymaga indeksu włączenia (product_id, updated_at)lub włączenia, (product_id, updated_at DESC)aby było wydajne. Nie tylko na (updated_at).
ypercubeᵀᴹ
5

Bez znajomości reszty bazy danych możesz sobie pozwolić na nieco niestandardową formę, aby przyspieszyć pobieranie cen produktów (zakładając, że za każdą pozycję przypada jedna cena).

Wystarczy utworzyć nową tabelę last_priceo nazwie typ pricew producttabeli i utworzyć wyzwalacz AFTER INSERT ON EACH ROWw pricetabeli. Za każdym razem, gdy tworzona jest nowa cena, aktualizuje powiązany produkt o najnowszą cenę. W ten sposób za każdym razem, gdy pobierasz produkt, pobierasz również jego ostatnią cenę.

Od wersji 9.3 PostgreSQL obsługuje zmaterializowane widoki. To dobry sposób na zdenormalizowanie danych, zachowanie normalnej formy do pisania i zdormalizowany widok do odczytu. Aktualizacja widoku może zostać uruchomiona przez mechanizm LISTEN / NOTIFY Postgresa.

greg
źródło
-1

Powinieneś mieć kolumnę daty i godziny WEF (ze skutkiem od) w tabeli cen. Użytkownik wprowadzi jego wartość podczas aktualizacji ceny. Następnie pobierz tylko wartość z desc wef limit 1.

ahsanghalib
źródło
To nie odpowiada na pytanie.
Colin 't Hart