Qual è il modo più veloce per recuperare l'ultima riga da una tabella?


11

Ho una tabella PostgreSQL Prices, con le colonne:

  • price (Decimale)
  • product_id (Int)

Ci sono anche created_ate updated_atcolonne.

I prezzi vengono aggiornati regolarmente e tengo i vecchi prezzi nella tabella. Per un determinato prodotto, l'ultimo prezzo nella tabella è il prezzo corrente.

Qual è il modo più efficiente per ottenere l'ultimo prezzo per un prodotto specifico:

  • Indice product_ide query per l'ultimo record
  • Aggiungi una terza colonna active(booleana) per contrassegnare il prezzo più recente e creare un indice composito ( product_ide active)
  • O qualcos'altro?

4
L'uso di un indice parziale con la condizione where activeprobabilmente aiuterebbe ancora di più a recuperare l'ultimo prodotto.
a_horse_with_no_name

Risposte:


11

Avrai bisogno di un indice su product_id indipendentemente dalla soluzione.

A condizione che tu abbia un indice sulla colonna updated_at, e tutto ciò che serve è recuperare "un prodotto specifico" come hai dichiarato, quindi farei:

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

Ma se non ottenessi i risultati desiderati o se avessi bisogno di ottenere il prezzo corrente per molti prodotti, proverei l'opzione di aggiungere una colonna attiva e impostandola su N per tutti i prezzi diversi da quello nuovo quando lo faccio aggiornamenti dei prezzi e quindi creerei un indice parziale dove attivo come suggerito da a_horse_with_no_name. Ci andrei solo se ne avessi bisogno in quanto aggiunge uno strato di complessità di aggiornamento delle righe dei prezzi precedenti per non essere attivo, ecc.


1
Questa query richiede un indice attivo (product_id, updated_at)- attivo (product_id, updated_at DESC)- per essere efficiente. Non solo (updated_at).
ypercubeᵀᴹ

5

Senza la conoscenza del resto del tuo database, puoi permetterti un po 'di forma non normale per accelerare il recupero dei prezzi dei prodotti (supponendo che ci sia un prezzo per ogni articolo).

Basta creare una nuova colonna denominata last_pricedi tipo pricenella producttabella e creare un trigger AFTER INSERT ON EACH ROWsulla pricetabella. Ogni volta che viene creato un nuovo prezzo, aggiorna il prodotto correlato con l'ultimo prezzo. In questo modo, ogni volta che recuperi un prodotto, ottieni anche il suo ultimo prezzo.

Dalla versione 9.3, PostgreSQL supporta viste materializzate. Questo è un bel modo per denormalizzare i dati, mantenendo una forma normale per la scrittura e una vista denormalizzata per la lettura. L'aggiornamento della vista può essere attivato dal meccanismo LISTEN / NOTIFY di Postgres.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.