Was ist der schnellste Weg, um die letzte Zeile aus einer Tabelle abzurufen?


11

Ich habe eine PostgreSQL-Tabelle Pricesmit den folgenden Spalten:

  • price (Dezimal)
  • product_id (Int)

Es gibt auch created_atund updated_atSpalten.

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_idund 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_idund active)
  • Oder etwas anderes?

4
Die Verwendung eines Teilindex mit der Bedingung where activewürde wahrscheinlich noch mehr dazu beitragen, das neueste Produkt abzurufen.
a_horse_with_no_name

Antworten:


11

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:

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

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.


1
Diese Abfrage benötigt einen Index für (product_id, updated_at)- oder für (product_id, updated_at DESC)-, um effizient zu sein. Nicht nur auf (updated_at).
Ypercubeᵀᴹ

5

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_pricetype pricein Ihrer productTabelle und erstellen Sie einen Trigger AFTER INSERT ON EACH ROWfür Ihre priceTabelle. 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.