> On 26/09/2023, at 5:34 PM, Jairo Graterón <jgrate...@gmail.com> wrote: > > Hola Enrique > la tabla tiene la siguiente definición >
Tirate el \d comprobante No veo el indice que mencionas en la definición. > create table comprobante > ( > id bigserial not null, > num_ruc varchar(11) not null, > num_comprobante bigint not null, > fecha date not null, > monto numeric(10,2), > estatus char(1) not null, -- 0 anulado, 1 activo > primary key(id), > unique (num_ruc, num_comprobante) > ); > para buscar rápidamente un cliente tenemos el siguiente índice > create index idx_num_ruc on comprobante(num_ruc); > El unique num_ruc,num_comprobante en el fondo es un trigger, Tirate los explain (buffers,analyze delete …. De la operación, esto te puede decir por que se demora tiempo. > Cuando se establece la relación comercial el estado(GOB) nos envía el > histórico de los comprobantes del cliente para cuando se realicen > ciertas operaciones se pueda validar el estatus, la fecha y el monto. Esto suena a que debes revisar por el tiempo que debes tener los registros, puede que tengas que mantener 6 años de registros. > > Ciertamente para eliminar un cliente se puede usar delete from comprobante > where num_ruc='999999' pero mensualmente se asocian o se van entre 100 a 200 > clientes y > el delete se vuelve lento para borrar millones de registros, es un > procedimiento que requiere autorización y registro de auditoría. > Si te preocupa el tamaño, revisa que estes usando compresión. > Se decidió no borrar ya que creaba mucho I/O en el disco que afecta el > desempeño del sistema, ahora esa tabla va por los 2mil millones y sigue > creciendo. > > Puedes desactivar los sorts, cuando borres, esto optimiza las busquedas secuenciales en postgresql para borrar cosas masivas. Todo depende del plan de ejecución de tu operación. > > > El mar, 26 sept 2023 a las 16:11, Enrique Herrera Noya > (<enrique.herreran...@gmail.com <mailto:enrique.herreran...@gmail.com>>) > escribió: > > veamos si te entiendo > tienes por un lado num_ruc y por otro num_comqrobante > > y la clave primaria la creas concatenando clapri = num_ruc.num_comprobante > > como el numero de comprobante siempre es mayor el mas reciente puedes > determinar desde que año quieres borrar basándote en el correlativo > > ahora bien si quiere borrar todo lo relacionado a un cliente, bastaría usar > una condición donde clapri sea menor a num_ruc.num_ultimocomprobante y que > ademas num_ruc = num_rucaborrar , de esta forma usas la clave primaria lo que > sera mas rápido que usar en la sentencia solo num_ruc que no es clave primaria > Borrado por clave primaria ( que tiene un indice Implicito ), es siempre más rápido. Dado que en este caso el indice es de una columna simple. > > > > El 26-09-23 a las 12:11, Jairo Graterón escribió: >> Saludos lista >> >> Tengo un requerimiento sobre liberar el espacio ocupado por registros de >> ventas de >> los clientes que ya no tienen relación comercial con nosotros. >> >> Actualmente la tabla comprobantes tiene 2mil millones de registros, debido a >> que >> tiene registros de históricos de ventas proporcionados por el estado para >> controlar >> la emisión única de comprobantes. Esto no es mucho, estas seguro que el espacio se te va en esto ? yo tengo una base de datos que me genera 2M de registros diarios. >> >> Cada cliente tiene su identificador único num_ruc junto con el número de >> comprobante es la clave primaria. No es mejor, cuando hagan un refactor que hagan una columna que refleje el dato? num_cliente. que significa ruc? >> >> Hacer un delete from comprobantes where num_ruc='xxx' no es óptimo ya que es >> lento y el espacio no se recupera en el disco, usamos servicios en la nube y >> cobran por espacio ocupado. Después de borrar, debes hacer un vacuum, sin embargo el espacio (marca de agua por lo que te cobran ya esta usado ) aun que hagas drop, vacuum, etc. la marca de agua del disco ya esta corrida, no vas a ahorrar plata en este nivel. Pero si es es mucho ( que 1T deben ser como 40USD en amazon por ejemplo ) despues de librar espacio tendras, que bajar la base, hacer un rsync al disco nuevo y eliminar el disco viejo. ( ignoro que ahorro puedas hacer ahi). >> >> Así que me gustaría sus experiencias si han implementado particionamiento de >> tablas ya que veo que no es necesario hacer delete sino drop table. Es problema del cloud es el espacio usado en el disco, no la base de datos. aun que tengas espacio libre no puedes achicar los discos, hacer mantención te puede ayudar a dejar de crecer en el futuro. cuando el disco se usa. ya estas pagando por el, Yo trabajaba en Amazon New Zealand, esta pregunta me la hicieron un par de veces algunos clientes, y uno de ellos recuerdo que terminaron haciendo un rsync para mover los datos de un disco a otro para pagar menos. >> >> Haciendo cálculos tendríamos la tabla maestra y 8mil tablas relacionadas por >> cada cliente asociado. >> Yo no tendría tantas tablas hijas. Creo que lo que necesitas es un proceso de off-boarding donde metes los clientes con todos los datos relacionados en una base con discos más lentos historica ( que debe ser más barato ). Ahora ojo que en sistemas más grandes es más barato tener un server que cloud, si las competencias están en tu empresa, mejor pongan un server, con discos IOAccelerators para cosas bien calientes y discos SSD que salen como 400 a 700 USD los discos de 1.6T SSD de 12Gb/s SAS, para HP o DELL. en un datacenter decente, puede que con varios discos y un par de servidores estes OK. El cloud también falla, no es aprueba de balas. y si tienes un desastre sin replicación y sin respaldos. bueno es ruleta rusa. En resumen, execution plan. revisa bien el modelo y asegurate que no estes callendo en un trigger que te este haciendo todo lento. > > Enrique Herrera Noya > -- > +56 992303151 > Red Hat Certified Engineer RHCE Nº100223072 (RH6.0) > Red Hat Certified System Administrato RHCSA Nº100223072 (RH6.0) > Red Hat Certified Technician (RHCT) Nº605010753835478 (RH5.0) > Novell Certified Linux Professional CLP 10 > Red Hat Delivery Specialist -Container Platform Application Deployment I > Red Hat Delivery Specialist - Container Platform Administration I > RED HAT SPECIALIST > How to Sell Red Hat OpenShift for Infrastructure > How to Sell Red Hat OpenShift for Developers > Red Hat Sales Engineer Specialist - Container Platform > Red Hat Sales Engineer Specialist – Automation