Considere crear una nueva tabla con el mismo esquema más la columna de versión de fila, y agregue una vista encima de ambas tablas que una toda la unión. Haga que las personas usen la vista y escriban en lugar de disparadores contra las tablas y vistas subyacentes.
Las inserciones deben enviarse a la nueva tabla, las actualizaciones deben mover los datos a la nueva tabla y las eliminaciones deben aplicarse a ambas tablas.
Luego, realice movimientos por lotes en segundo plano, moviendo tantos registros a la vez como pueda a la nueva tabla. Todavía puede tener problemas de concurrencia mientras esto sucede, y algunos planes de ejecución craptaculares, pero le permite permanecer en línea mientras ocurren los movimientos.
Lo ideal es que comience el proceso un viernes por la tarde para minimizar el efecto en los usuarios finales e intente hacerlo antes del lunes por la mañana. Una vez que está en su lugar, puede cambiar la vista para apuntar solo a la nueva tabla, y los planes de ejecución craptaculares desaparecen. Idealmente.
Para evitar que los disparadores se activen cuando los datos se migran en lotes, observe el número de filas en las tablas eliminadas / insertadas en el disparador y omita las actividades si están cerca del número de filas en su lote.
Al final, Michael decidió omitir la vista (y no eliminarla de la tabla original) para obtener planes más estables. La compensación contenía esencialmente dos copias de la tabla. Lo convirtió en una serie de publicaciones de blog .
Si lo
TIMESTAMP
que está agregando esNULLABLE
:VARBINARY(8)
columnaDespués de rellenar, en las instrucciones SQL consecutivas,
DROP
laVARBINARY(8)
columna que acaba de agregar y rellenar, y agregue laTIMESTAMP NULL
columna.Si lo
TIMESTAMP
que está agregando esNOT NULLABLE
:BINARY(8)
columnaDespués de que se haya completado, en las instrucciones SQL consecutivas,
DROP
laBINARY(8)
columna que acaba de agregar y que se completó y laADD THE TIMESTAMP NOT NULL
columna.fuente