Ich habe eine PostgreSQL-Tabelle Prices
mit den folgenden Spalten:
price
(Dezimal)product_id
(Int)
Es gibt auch created_at
und updated_at
Spalten.
Die Preise werden regelmäßig aktualisiert und ich behalte alte Preise in der Tabelle. Für ein bestimmtes Produkt ist der letzte Preis in der Tabelle der aktuelle Preis.
Was ist der effizienteste Weg, um den letzten Preis für ein bestimmtes Produkt zu erhalten:
- Index
product_id
und Abfrage für den letzten Datensatz - Fügen Sie eine dritte Spalte
active
(Boolean) hinzu, um den neuesten Preis zu markieren und einen zusammengesetzten Index zu erstellen (product_id
undactive
) - Oder etwas anderes?
postgresql
physical-design
Mike81
quelle
quelle
where active
würde wahrscheinlich noch mehr dazu beitragen, das neueste Produkt abzurufen.Antworten:
Sie benötigen unabhängig von der Lösung einen Index für product_id.
Vorausgesetzt, Sie haben einen Index für die Spalte "update_at" und müssen lediglich "ein bestimmtes Produkt" abrufen, wie Sie angegeben haben, dann würde ich Folgendes tun:
Wenn ich jedoch nicht die gewünschten Ergebnisse erzielen würde oder den aktuellen Preis für viele Produkte ermitteln müsste, würde ich versuchen, eine aktive Spalte hinzuzufügen und sie für alle anderen Preise als den neuen auf N zu setzen Aktualisierungen der Preise und dann würde ich einen Teilindex erstellen, wo aktiv, wie von a_horse_with_no_name vorgeschlagen. Ich würde nur dorthin gehen, wenn ich müsste, da dies die Komplexität der Aktualisierung früherer Preiszeilen erhöht, um nicht aktiv zu sein usw.
quelle
(product_id, updated_at)
- oder für(product_id, updated_at DESC)
-, um effizient zu sein. Nicht nur auf(updated_at)
.Ohne Kenntnis des Restes Ihrer Datenbank können Sie sich ein wenig ungewöhnliche Form leisten, um das Abrufen von Produktpreisen zu beschleunigen (vorausgesetzt, es gibt einen Preis für jeden Artikel).
Erstellen Sie einfach eine neue Spalte mit dem Namen
last_price
typeprice
in Ihrerproduct
Tabelle und erstellen Sie einen TriggerAFTER INSERT ON EACH ROW
für Ihreprice
Tabelle. Jedes Mal, wenn ein neuer Preis erstellt wird, wird das zugehörige Produkt mit dem neuesten Preis aktualisiert. Auf diese Weise erhalten Sie jedes Mal, wenn Sie ein Produkt abrufen, auch dessen letzten Preis.Seit Version 9.3 unterstützt PostgreSQL materialisierte Ansichten. Dies ist eine gute Möglichkeit, die Daten zu denormalisieren, wobei eine normale Form zum Schreiben und eine denormalisierte Ansicht zum Lesen beibehalten werden. Die Aktualisierung der Ansicht kann durch den LISTEN / NOTIFY-Mechanismus von Postgres ausgelöst werden.
quelle