Re: borrado de algunos registros en tablas grandes

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Hellmuth Vargas <hivs77(at)gmail(dot)com>
Cc: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: borrado de algunos registros en tablas grandes
Date: 2018-01-18 20:34:16
Message-ID: 20180118203416.llenglwrtt2a6l4k@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hellmuth Vargas escribió:
> Hola Lista
>
> tengo un servidor PostgreSQL 9.4 en el cual se registra el log de un IVR
> (atención telefónica automatizada por menús) donde la tabla ya esta
> pesando 162GB, se tiene informacion desde el 2015 y se desea conservar en
> linea solo el ultimo año (por cuestiones de espacio y rendimiento), la
> aplicación que inserta estos datos esta implementada con Hibernate por lo
> tanto no es posible implementar particiones pues al insertar regresa 0
> registros y falla la aplicación. Se esta realizando un proceso nocturno
> para mover los registros mas viejos de un año y y borrar los mismos de la
> tabla en cuestión. Dado el tamaño de la tabla, las características de la
> maquina y que el servicio es 7x24 no es posible ejecutar un VACUUM FULL
> para recuperar el espacio sino se ejecuta un VACUUM ANALYZE, por lo tanto
> los datos nuevos deben insertarse en los bloques marcados como libres por
> el vacuum, esto afectaría el rendimiento de las operaciones que se hagan en
> la tabla (bloat, entre otros aspectos)?

Pienso que lo más barato sería acceder la BD directamente al hacer el
insert. Como debería ser una operación muy específica, no hay que
modificar toda la aplicación sino sólo una pequeña parte.

Dicho esto, la verdad es que aplicar particionamiento post-facto es
operacionalmente bastante complicado -- vas a requerir varios bloqueos
en las tablas existentes para mover datos y establecer el ambiente
inicial, así que no sé qué tan factuble sea en tu caso.

Respecto a tu idea: Yo creo que es factible.
Ejecutar VACUUM después de cada DELETE liberará el espacio para que los
insert futuros puedan usarlo. No se liberará espacio al sistema
operativo, pero esto no debería tener importancia. Ejemplo: si haces
los DELETE de los registros de más de 104 semanas de edad una vez a la
semana, en un tiempo no muy largo deberías llegar a un estado
estacionario en el cual los nuevos inserts de cada semana van usando el
espacio liberado por los de la semana X-104 que se acaban de borrar --
sin efecto negativo en el rendimiento.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Hellmuth Vargas 2018-01-18 20:43:24 Re: borrado de algunos registros en tablas grandes
Previous Message Hellmuth Vargas 2018-01-18 20:27:16 borrado de algunos registros en tablas grandes