aquí me surge que mas que el SQL en si, es un tema de la gestión de datos,
tenemos por costumbre, " dale echale datos no mas la bbdd aguanta"
(donde trabajo, estamos en las mismas pero por inserción)
estuvimos dándole vueltas como solucionar el tema, y miramos fuera de la
caja:
del archivo histórico solo necesitamos unos años hacia atrás, por ende
solo una vez debimos esperar bastante tiempo en proceso , las
siguientes iteraciones siempre es menor el movimiento de datos
historicobig contiene el historial de 5 años hacia atrás, historico5
contiene los últimos 5 años, de esa forma , en el big se usa un sql no
necesariamente optimizado
y en le historico5 , es mucho menor los teras, así que se demora menos
el proceso , para la auditoria estarán todos los datos, y para el
borrado sera mas fácil.
cuando los datos en historico5 son mas viejos de 5 años, se mueven a
historicobig
espero te ayuden estas ideas
El 26-09-23 a las 18:16, Horacio Miranda escribió:
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>) escribió:
veamos si te entiendo
tienes por un lado *num_ruc *y por otro *num_comqrobante
*
y la clave primaria la creas concatenando *cla***pri =*
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***cla***pri***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
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