Recientemente agregué una columna de bits con capacidad NULL a una tabla que tiene cerca de 500 millones de filas. No hay un valor predeterminado en la columna, sin embargo, todas las inserciones están especificando un valor de 0 o 1, y ejecuté una rutina única para asignar 0 o 1 a todas las filas existentes (actualizando las filas en lotes pequeños). Cada fila ahora debería tener un 0 o 1 en esa columna.
Quiero que la columna de bits no sea anulable, sin embargo, cuando intenté hacerlo a través de ALTER TABLE t1 ALTER COLUMN c1 bit not null
, comenzó a ejecutarse durante 3 minutos y la detuve porque estaba bloqueando todas las lecturas de la tabla y sospeché que iba a tomar mucho tiempo completarla . Es posible que no tarde demasiado, pero no podría arriesgarme a una gran falta de disponibilidad. El retroceso en sí tomó 6 minutos.
¿Tiene alguna sugerencia sobre cómo puedo hacer que la columna no sea anulable sin que tarde potencialmente horas en completarse? Además, ¿hay alguna forma de estimar cuánto tiempo ALTER TABLE ALTER COLUMN
tardaría en completarse el estado de cuenta que comencé y luego cancelé?
Estoy usando SQL Server 2017 Web Edition.
fuente
SELECT c1, count(*) FROM t1 GROUP BY c1
que tardó aproximadamente 9 minutos en ejecutarse. LaALTER TABLE ALTER COLUMN
declaración real después de eso tomó 25 minutos en completarse. No está mal.Si está en Enterprise Edition (EE), una mejor estrategia podría haber sido agregarlo como
NOT NULL
predeterminado0
o1
(lo que sea más común).Este es un cambio de metadatos solo en EE . Luego actualice los que necesitan ser volteados. Esto significa menos actualizaciones y no es necesario cambiar la nulabilidad de la columna cuando haya terminado. - martin-smith
fuente
Intente copiar los datos a una nueva tabla, luego cámbiele el nombre. Debe tener cuidado con las restricciones e índices. Eso es lo que está haciendo el diseñador de tablas SSMS cuando desea reordenar las columnas (por ejemplo), pero debe verificar el script para ver si hay algo que no se ve bien.
Durante la copia, el acceso de lectura a la tabla de origen no es un problema, pero si hay escrituras, pueden bloquearse o no copiarse, según el nivel de aislamiento.
fuente