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?