¿Cuál es la forma más rápida de obtener la última fila de una tabla?


11

Tengo una tabla PostgreSQL Prices, con las columnas:

  • price (Decimal)
  • product_id (En t)

También hay created_aty updated_atcolumnas.

Los precios se actualizan regularmente y mantengo los precios antiguos en la tabla. Para un producto dado, el último precio de la tabla es el precio actual.

¿Cuál es la forma más eficiente de obtener el último precio para un producto específico?

  • Indice product_idy consulte el último registro
  • Agregue una tercera columna active(booleana) para marcar el último precio y crear un índice compuesto ( product_idy active)
  • ¿O algo mas?

44
El uso de un índice parcial con la condición where activeprobablemente ayudaría aún más a recuperar el último producto.
a_horse_with_no_name

Respuestas:


11

Necesitará un índice en product_id independientemente de la solución.

Siempre que tenga un índice en la columna updated_at, y todo lo que necesita es buscar "un producto específico" como usted indicó, entonces haría:

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

Pero si no obtuve los resultados que deseaba o si necesitaba obtener el precio actual de muchos productos, entonces probaría la opción de agregar una columna activa y establecerla en N para todos los precios que no sea el nuevo al hacerlo actualizaciones de los precios y luego crearía un índice parcial donde esté activo según lo sugerido por a_horse_with_no_name. Iría allí solo si fuera necesario, ya que agrega una capa de complejidad de actualizar las filas de precios anteriores para que no estén activas, etc.


1
Esta consulta necesita un índice (product_id, updated_at)activado o (product_id, updated_at DESC)activado para ser eficiente. No solo en (updated_at).
ypercubeᵀᴹ

5

Sin el conocimiento del resto de su base de datos, puede permitirse un poco de forma no normal para acelerar la obtención de precios de los productos (suponiendo que haya un precio por cada artículo).

Simplemente cree una nueva columna llamada last_pricede tipo priceen su producttabla y cree un activador AFTER INSERT ON EACH ROWen su pricetabla. Cada vez que se crea un nuevo precio, actualiza el producto relacionado con el último precio. De esta manera, cada vez que obtiene un producto, también obtiene su último precio.

Desde la versión 9.3, PostgreSQL admite vistas materializadas. Esta es una buena manera de desnormalizar los datos, manteniendo una forma normal para escribir y una vista desnormalizada para leer. La actualización de la vista puede ser activada por el mecanismo LISTEN / NOTIFY de Postgres.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.