Hola Silvio,

El jue., 5 de diciembre de 2019 02:46, Silvio Bravo Cadó <
bravoc...@gmail.com> escribió:

> Hola lista,
> Espero se encuentren muy bien, les escribo porque tengo una duda con
> respecto a si estoy realizando bien las actualizaciones en una tabla o tal
> vez sea algo del diseño de la solución.
> Tengo una tabla A que busca llevar el inventario de productos, que podría
> describirse así:
>
> Id                   int
> nombre          text
> precio            numeric(8,2)
> cantidad         int
> disponibilidad int
>
> Cada vez que se crea un nuevo registro se define la cantidad y la
> disponibilidad que son las mismas. También se tiene un check constraint
> donde cantidad >= disponibilidad.
>
> Por otro lado cuando se tiene otra tabla B que representa las compras:
>
> Id                  int
> producto_id   int
>
> Cada vez que se agrega un registro en B se ejecuta un trigger que hace un
> update a A para restar disponibilidad con un: UPDATE A SET disponibilidad =
> disponibilidad - 1 WHERE id = New.id
>
> El problema es que estas tablas pueden tener mucha concurrencia, muchos
> usuarios finales intentando comprar y por temporalidad compran el mismo
> producto y cuando hay picos de usuarios el update puede llegar a tardar
> hasta 60 segundos o mas en completarse.
>
> Mi duda es si hay alguna forma de mejorar el rendimiento de este update.
>

Primero, quieres asegurar la consistencia de la base y me imagino que
ejecutas el INSERT y el UPDATE en una transacción.

Si tienes muchos accesos concurrentes a la misma fila, seguro que se van a
encolar. Algunas preguntas:

1. Cuántas filas tiene la tabla A?
2. Sólo para validar: tienes una llave primaria sobre el campo id?
3. Cuántas columnas y cuántos índices tiene la tabla real?
4. Cuántos usuarios concurrentes puedes tener?

Como idea loca, podrías simular varios productos (digamos 4) que se
reparten el stock completo y cada vez que llega un pedido se resta del
stock de uno al azar?

Olivier

Reply via email to