En nuestra organización, requerimos ejecutar una migración de base de datos en datos del sitio en vivo. Queremos agregar una columna con valor predeterminado en una tabla con alrededor de 1000 filas. ¿Puede sugerir algún método para que obtengamos un tiempo de inactividad mínimo o nulo? Estamos utilizando la base de datos postgresql y la aplicación elixir phoenix. Gracias.
PD: queremos un tiempo de inactividad mínimo, no cero exacto. También queremos ejecutar la migración usando Ecto en elixir y no a través de un script.
Además, si puede indicar el tiempo esperado para ejecutar la migración cuando tenemos un conjunto de restricciones predeterminado.
En general, ALTER TABLE requiere un bloqueo exclusivo en la tabla, pero agregar una columna con valores predeterminados puede ser muy rápido porque solo se debe actualizar el catálogo del sistema (y esta acción no depende del tamaño de la tabla):
Por ejemplo, con PostgreSQL 12, obtengo:
# select count(*) from t; count --------- 1000000 (1 row) Time: 60.003 ms # begin; BEGIN Time: 0.096 ms # alter table t add newcol int default 19; ALTER TABLE Time: 0.457 ms # commit; COMMIT Time: 9.211 msDebería poder obtener un tiempo de inactividad muy pequeño con PostgreSQL 11 o 12. Con una versión inferior, PG reescribe la tabla: pero incluso en este caso, 1000 filas son muy, muy pequeñas y también deberían ser muy rápidas.