Tengo una tabla PostgreSQL Prices
, con las columnas:
price
(Decimal)product_id
(En t)
También hay created_at
y updated_at
columnas.
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_id
y consulte el último registro - Agregue una tercera columna
active
(booleana) para marcar el último precio y crear un índice compuesto (product_id
yactive
) - ¿O algo mas?
postgresql
physical-design
Mike81
fuente
fuente
where active
probablemente ayudaría aún más a recuperar el último producto.Respuestas:
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:
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.
fuente
(product_id, updated_at)
activado o(product_id, updated_at DESC)
activado para ser eficiente. No solo en(updated_at)
.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_price
de tipoprice
en suproduct
tabla y cree un activadorAFTER INSERT ON EACH ROW
en suprice
tabla. 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.
fuente