Tengo una tabla con aproximadamente 5 millones de filas que tiene una restricción fk que hace referencia a la clave principal de otra tabla (también aproximadamente 5 millones de filas).PostgreSQL - deshabilitar las restricciones
Necesito eliminar aproximadamente 75000 filas de ambas tablas. Sé que si trato de hacer esto con la restricción fk activada, tomará una cantidad inaceptable de tiempo.
Viniendo de un fondo de Oracle, mi primer pensamiento fue deshabilitar la restricción, hacer la eliminación & y luego volver a habilitar la restricción. PostGres parece permitirme desactivar los activadores de restricciones si soy un súper usuario (no lo soy, pero estoy iniciando sesión como el usuario que posee/creó los objetos) pero eso no parece ser lo que quiero.
La otra opción es soltar la restricción y luego restablecerla. Me preocupa que la reconstrucción de la restricción demorará años dado el tamaño de mis tablas.
¿Alguna idea?
editar: después del aliento de Billy He intentado hacer la eliminación sin cambiar ninguna restricción y toma más de 10 minutos. Sin embargo, he descubierto que la tabla desde la que intento eliminar tiene una clave externa autorreferencial ... duplicada (& no indexada).
Actualización final - Dejé caer la clave externa autorreferencial, hice mi eliminación y la agregué nuevamente. Billy tiene razón en todo pero desafortunadamente no puedo aceptar su comentario como la respuesta.
Si está tomando tanto tiempo, incluso con 5 millones de filas, luego de que ha configurado algo mal. –
¿Qué? ¿Borrar o volver a habilitar la restricción? Y sí, es posible que algo (s) esté configurado incorrectamente o de una manera menos optimizada: la base de datos ha sido 'construida' por hibernate (no tuve nada que ver con eso). – azp74
La eliminación. Los cheques FK de tablas indexadas toman tiempo lineal y eliminan 75000 + 75000 filas = 150 000 filas. Considere un caso peor 19 comparaciones por cheque FK (búsqueda binaria, lg (5 millones) == 19), y tal vez 20 comparaciones de máquinas por comparación de filas, lo que equivale a 57 000 000 comparaciones. Considerando una estimación conservadora de que la máquina promedio puede hacer mil millones de comparaciones por segundo, es fácil, esto aún debería tomar menos de un segundo de tiempo de CPU. Cargar desde el disco tampoco debería ser un problema importante porque incluso en 5 millones de filas, la tabla debe caber en la RAM. –