No tengo una "mejor" respuesta, pero tengo una "menos mala" respuesta que podría permitirle hacer las cosas razonablemente rápido.
Mi tabla tenía filas de 2MM y el rendimiento de la actualización estaba disminuyendo cuando intenté agregar una columna de marca de tiempo secundaria que estaba predeterminada en la primera.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Después de que colgó durante 40 minutos, probé esto en un pequeño lote para tener una idea de cuánto tiempo podría llevar esto: el pronóstico era de alrededor de 8 horas.
La respuesta aceptada es definitivamente mejor, pero esta tabla se usa mucho en mi base de datos. Hay unas pocas docenas de mesas que FKEY en él; Quería evitar cambiar LLAVES EXTRANJERAS en tantas tablas. Y luego hay vistas.
Un poco de búsqueda de documentos, estudios de casos y StackOverflow, y tuve el "¡A-Ha!" momento. El drenaje no estaba en la ACTUALIZACIÓN central, sino en todas las operaciones de ÍNDICE. Mi tabla tenía 12 índices: algunos para restricciones únicas, algunos para acelerar el planificador de consultas y algunos para búsqueda de texto completo.
Cada fila que se ACTUALIZÓ no solo funcionaba en DELETE / INSERT, sino también la sobrecarga de alterar cada índice y verificar las restricciones.
Mi solución fue eliminar cada índice y restricción, actualizar la tabla y luego agregar todos los índices / restricciones nuevamente.
Tomó alrededor de 3 minutos escribir una transacción SQL que hiciera lo siguiente:
- EMPEZAR;
- índices caídos / constaints
- tabla de actualización
- volver a agregar índices / restricciones
- COMETER;
El script tardó 7 minutos en ejecutarse.
La respuesta aceptada es definitivamente mejor y más adecuada ... y prácticamente elimina la necesidad de tiempo de inactividad. Sin embargo, en mi caso, habría llevado mucho más trabajo de "Desarrollador" para usar esa solución y teníamos una ventana de 30 minutos de tiempo de inactividad programado en el que podría lograrse. Nuestra solución lo abordó en 10.
ALTER TABLE .. ADD COLUMN ...o esa parte también debe ser respondida?