Contenido de esta guía
Por qué el tamaño no basta para estimar el riesgo
Dos sentencias ALTER TABLE sobre la misma tabla pueden tener costes muy distintos. Una puede cambiar solo metadatos; otra puede leer todas las filas, reescribir la tabla, reconstruir índices o impedir temporalmente escrituras.
Antes de desplegar, identifica tres cosas: el trabajo físico que realiza el motor, el bloqueo que necesita y la duración durante la que una versión antigua de la aplicación convivirá con el nuevo esquema.
Tres clases de coste
| Clase | Qué puede ocurrir | Ejemplos posibles |
|---|---|---|
| Metadatos | Cambia el catálogo sin recorrer todas las filas | Añadir ciertas columnas o cambiar un valor predeterminado |
| Validación | Lee filas para comprobar una regla | Añadir CHECK o NOT NULL |
| Reescritura o copia | Transforma y vuelve a guardar datos | Cambiar algunos tipos, eliminar columnas o reordenarlas |
La clase exacta depende del motor, la versión, el tipo de columna, los valores predeterminados, las restricciones, los índices y la configuración.
Ejemplo: añadir un canal a pedidos
ALTER TABLE pedidos
ADD COLUMN canal VARCHAR(20);Añadir primero una columna que admite NULL suele facilitar la compatibilidad. La aplicación puede empezar a escribir el nuevo dato sin obligar a completar todas las filas antiguas durante el mismo despliegue.
No concluyas que la operación será instantánea solo por su aspecto. Pide al motor el algoritmo o plan disponible, prueba con una copia representativa y mide bloqueos, espacio temporal y duración.
Qué documenta cada motor
- PostgreSQL actual: añadir una columna con un valor predeterminado constante puede evitar actualizar cada fila en ese momento; un valor predeterminado volátil sí puede exigir completar todas las filas. Cambiar tipos y validar reglas puede requerir más trabajo.
- MySQL 8.4 con InnoDB:
INSTANTes el algoritmo predeterminado cuando la operación lo admite. Cambiar el tipo de una columna se documenta como una operación que necesitaCOPY, mientras que ciertas ampliaciones deVARCHARpueden realizarse en el lugar. - SQLite actual: renombrar una tabla o columna y añadir una columna sin restricciones que deban comprobarse puede ser independiente del número de filas. Desde SQLite 3.53.0 también existe
ALTER COLUMN ... SET/DROP NOT NULL; establecerNOT NULLdebe comprobar los datos existentes. Operaciones que validan restricciones o eliminan una columna pueden recorrer o reescribir el contenido, por lo que su coste crece con la tabla. - SQL Server: las operaciones y opciones dependen de la edición y del objeto; un cambio de columna puede bloquear y algunas operaciones ofrecen variantes en línea o reanudables.
Plan de migración por fases
- Medir: tamaño, ritmo de escrituras, índices y dependencias.
- Ensayar: copia con volumen y distribución similares.
- Expandir: añadir una estructura compatible con ambas versiones de la aplicación.
- Completar: migrar datos en lotes observables cuando sea necesario.
- Restringir: validar y añadir reglas finales después.
- Retirar: eliminar columnas antiguas en otro despliegue.
Errores frecuentes
Probar solo con una tabla vacía
Una sentencia que tarda milisegundos sin filas no representa una tabla grande ni concurrida. También es peligroso agrupar varios cambios: el motor puede aplicar el algoritmo más costoso del conjunto y prolongar el bloqueo.
No uses una estimación genérica como garantía. Registra la versión del motor, la sentencia exacta, el volumen y el resultado del ensayo.
Comprueba lo aprendido
Planifica una referencia externa obligatoria
Una tabla pedidos con millones de filas debe incorporar referencia_externa, que terminará siendo única y obligatoria. Describe el orden de despliegue sin bloquear toda la migración en una sola sentencia.
NULL.NOT NULL al final, según las capacidades del motor.Solución razonada
-- Fase 1: estructura compatible
ALTER TABLE pedidos
ADD COLUMN referencia_externa VARCHAR(80);
-- Las fases de relleno, unicidad y NOT NULL
-- se ejecutan después y con sintaxis del motor.La solución separa compatibilidad, migración de datos y restricciones. La sentencia final concreta debe diseñarse con la documentación y las opciones de operación en línea del motor utilizado.
Comprobaciones antes de producción
- Algoritmo real elegido y posibilidad de forzarlo o rechazar alternativas.
- Tipo y duración de bloqueos.
- Espacio adicional para copias, índices y registros.
- Impacto sobre réplicas, copias de seguridad y recuperación.
- Consulta de cancelación y plan de reversión.
- Métricas que indican continuar o abortar.
Qué debes recordar
- El coste lo determina la operación concreta, no solo el tamaño.
- Metadatos, validación y reescritura son trabajos distintos.
- Las capacidades cambian entre motores y versiones.
- Ensaya con datos representativos y despliega por fases.