From: | Olivier Gautherot <ogautherot(at)gautherot(dot)net> |
---|---|
To: | Silvio Bravo Cadó <bravocado(at)gmail(dot)com> |
Cc: | postgre sql <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Update concurrente |
Date: | 2019-12-05 08:07:02 |
Message-ID: | CAJ7S9TXZUKSX_CkDksG+47n=jA1JybSMFkKfVKyijPvcsV+CXA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Hola Silvio,
El jue., 5 de diciembre de 2019 02:46, Silvio Bravo Cadó <
bravocado(at)gmail(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Silvio Bravo Cadó | 2019-12-05 17:56:09 | Re: Update concurrente |
Previous Message | Silvio Bravo Cadó | 2019-12-05 01:46:15 | Update concurrente |