On Tue, 26 Sept 2023 at 16:39, Jairo Graterón <jgrate...@gmail.com> wrote: > > Hola Mario, > > La tabla no está particionada, y se pueden borrar los registros usando sólo > el num_ruc > > podría usar también delete from comprobantes where num_ruc in > ('aaaa','bbbb','cccc','dddd','eeee') > pero hay clientes que tienen históricos de millones de registros y puede > tardar un par de horas en ejecutar la operación. >
Creo que te estas complicando demás. Con lo que comentas, suena que el problema va en el modelo porque parece que no puedes identificar fácilmente a quienes no son tus clientes. Ahora si tu intención es meramente usar particiones, creo que ya tienes tu respuesta. > La idea del particionamiento es poder hacer drop table comprobante_num_ruc y > recuperar el espacio además de llevar > el registro de cuáles clientes se realizó la limpieza. > > pg_rewrite voy a revisarlo. > > El mar, 26 sept 2023 a las 15:20, Mario González Troncoso > (<gonzalema...@gmail.com>) escribió: >> >> On Tue, 26 Sept 2023 at 13:43, Jairo Graterón <jgrate...@gmail.com> wrote: >> > >> > 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. >> > >> > Cada cliente tiene su identificador único num_ruc junto con el número de >> > comprobante es la clave primaria. >> > >> > 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. >> > >> >> Pero si entiendo bien, si tienes que borrar los registros de algunos >> clientes y parte de la clave primaria es el identificador del cliente, >> ¿por qué tienes que indicar el número de comprobante para borrar? >> Cuando creaste la table, creaste particiones? Sino lo hiciste, no >> puedes transformar una tabla normal a una particionada [1] >> >> Asumiendo que es una tabla normal yo pensaría en estas 2 opciones: >> a) Buscaría un filtro para ejecutar "DELETE FROM comprobantes WHERE >> <FILTRO>..." Y ejecutaría VACUUM FULL al final para devolver el >> espacio al sistema operativo >> b) Usaría pg_rewrite [2] para generar un nuevo esquema de tablas con >> particiones. esto significaría tener suficiente espacio en disco para >> duplicar la tabla. >> >> Personalmente no he usado `pg_rewrite` pero lo que mencionas se puede >> hacer con esta extensión. >> >> [1] >> https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE >> [2] >> https://www.cybertec-postgresql.com/en/pg_rewrite-postgresql-table-partitioning/ >> >> > 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. >> > >> > Haciendo cálculos tendríamos la tabla maestra y 8mil tablas relacionadas >> > por cada cliente asociado. >> > > -- https://www.linkedin.com/in/gonzalemario