Tenemos una tabla con 2.3B filas en ella. Nos gustaría cambiar una columna de NOT NULL a NULL. La columna está contenida en un índice (no el índice agrupado o PK). El tipo de datos no está cambiando (es un INT). Solo la nulabilidad. La declaración es la siguiente:
Alter Table dbo.Workflow Alter Column LineId Int NULL
La operación toma más de 10 antes de detenerla (ni siquiera hemos dejado que se complete porque es una operación de bloqueo y estaba tardando demasiado). Probablemente copiaremos la tabla a un servidor de desarrollo para probar cuánto tiempo lleva realmente. Pero, ¿tengo curiosidad por saber si alguien sabe qué está haciendo SQL Server debajo del capó cuando se convierte de NOT NULL a NULL? Además, ¿deberán reconstruirse los índices afectados? El plan de consulta generado no indica lo que está sucediendo.
La tabla en cuestión está agrupada (no es un montón).
fuente
Respuestas:
Como aludió @Souplex en los comentarios, una posible explicación podría ser si esta columna es la primera
NULL
columna de tabla en el índice no agrupado en el que participa.Para la siguiente configuración
sys.dm_db_index_physical_stats muestra que el índice no agrupado
ix
tiene 248 páginas de hoja y una sola página raíz.Una fila típica en una página de índice se ve así
Y en la página raíz
Entonces corriendo ...
Devuelto
Verificando la hoja de índice nuevamente, las filas ahora se ven como
y las filas en las páginas de nivel superior como a continuación.
Cada fila se ha actualizado y ahora contiene dos bytes para el recuento de columnas junto con otro byte para NULL_BITMAP.
Debido al ancho de fila adicional, el índice no agrupado ahora tiene 285 páginas de hoja y ahora dos páginas de nivel intermedio junto con la página raíz.
El plan de ejecución para el
se ve de la siguiente manera
Esto crea una nueva copia del índice en lugar de actualizar la existente y la necesidad de dividir las páginas.
fuente
Definitivamente volverá a crear el índice no agrupado y no solo actualizará los metadatos. Esto se prueba en SQL 2014 y realmente no debería probarse en un sistema de producción:
Y ahora para la parte divertida:
Esto nos dará las páginas de la base de datos donde se almacenan la tabla y el índice no agrupado.
Encuentre
PagePID
dóndeIndexID
es 2 yPageType
es 2, y luego haga lo siguiente:y entonces:
Observe que hay un mapa de bits nulo en el encabezado:
Ahora hagamos:
Si está realmente impaciente, puede intentar ejecutar el
dbcc page
comando nuevamente, pero fallará, así que verifiquemos la asignación nuevamente conDBCC IND (0, z, -1)
. La página se habrá movido como por arte de magia.Por lo tanto, cambiar la nulabilidad de una columna afectará el almacenamiento de índices no agrupados que cubren esa columna, ya que los metadatos deben actualizarse y no debería necesitar reconstruir los índices después.
Se
ALTER TABLE ... ALTER COLUMN ...
pueden realizar muchas operaciones aONLINE
partir de SQL Server 2016, pero:fuente