Tenemos una aplicación de base de datos Oracle madura (en producción durante más de 10 años), y durante ese tiempo, hemos estado utilizando scripts de nuestra propia invención para eliminar datos antiguos que ya no se necesitan . Funcionan emitiendo instrucciones de eliminación en las tablas apropiadas, en un ciclo con confirmaciones frecuentes, para evitar sobrecargar el sistema con E/S o utilizar demasiado espacio de deshacer.Técnicas para eliminar datos antiguos en bases de datos Oracle
Funcionan bien, en su mayor parte. Se ejecutan a diario, y se tarda aproximadamente una hora para eliminar los datos del sistema de los días más antiguos. Las principales inquietudes que tengo son los efectos en las tablas y los índices que puede tener toda esta eliminación, y el hecho de que aunque no carguen demasiado el sistema, eliminar el valor de un día en ese corto tiempo tiene el efecto de soplar fuera de la caché del búfer de instancias, lo que resulta en consultas posteriores que se ejecutan un poco más lento durante las próximas horas a medida que la memoria caché se restaura gradualmente.
Durante años hemos estado considerando mejores métodos. En el pasado, había escuchado que la gente usaba tablas particionadas para administrar la recolección de datos antiguos, por ejemplo, un mes por partición y descartando la partición más antigua mensualmente. El principal inconveniente de este enfoque es que nuestras reglas de cosecha van más allá de "eliminar el mes X". Los usuarios pueden especificar cuánto tiempo deben permanecer en el sistema los datos, en función de los valores clave (por ejemplo, en una tabla de facturas, la cuenta foo puede eliminarse después de 3 meses, pero la barra de cuenta puede permanecer durante 2 años).
También existe la cuestión de la integridad referencial; La documentación de Oracle habla sobre el uso de particiones para purgar datos principalmente en el contexto de almacenes de datos, donde las tablas tienden a ser hipercubos. La nuestra está más cerca del final OLTP de las cosas, y es común que los datos en el mes X tengan relaciones con los datos en el mes Y. Crear las claves de particionamiento adecuadas para estas tablas sería, en el mejor de los casos, algo delicado.
En cuanto a los reventones de caché, he leído un poco sobre la configuración de cachés de búfer dedicados, pero parece que es más por cada tabla, en lugar de por usuario o por transacción. Para preservar el caché, realmente me gustaría que el trabajo de cosecha solo guarde el valor de una transacción en el caché en cualquier momento, ya que no hay necesidad de mantener los datos una vez eliminados.
¿Estamos atascados usando eliminaciones en el futuro previsible, o hay otras formas más inteligentes de manejar la cosecha?
+1 buena pregunta, desearía tener una solución inteligente, porque yo podría utilizar yo mismo ;-) – DCookie
es mantener el los datos no son una opción? es decir, podría filtrar registros antiguos en sus consultas (por ejemplo, utilizando predicados VPD) y simplemente no devolver los registros anteriores. Solo digo que si eliminar las filas está causando un problema de rendimiento, al menos consideraría la posibilidad de que mantenerlas no necesariamente sea una situación peor. –