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