¿Cuál es la forma más eficiente de alterar una definición de columna en una tabla con millones de filas?

9

Necesito cambiar una columna de NOT NULL a NULL en una tabla que contiene millones de filas. He intentado un simple

alter table Table1 ALTER COLUMN Column1 XML NULL

Pero lleva una eternidad. Asi que aqui están mis preguntas:

  1. ¿Por qué lleva tanto tiempo aplicar el alter?
  2. Hay una mejor manera de hacerlo?
Jonas Stawski
fuente

Respuestas:

3

1) Se necesitaría más información sobre la estructura completa de la tabla + índices no agrupados para descubrir correctamente lo que está sucediendo, pero mi sospecha es algo que tiene que ver con el mapa de bits NULL.

Consulte para obtener más detalles sobre el tema. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

2) Sí, siempre que tenga el espacio de almacenamiento, cree una nueva tabla con la capacidad de anulación correcta y transfiera los datos en varios lotes para evitar el crecimiento excesivo de registros y cambie la tabla utilizando la técnica que se detalla a continuación. He hecho esto varias veces con poco o ningún tiempo de inactividad.

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html

Sankar Reddy
fuente
6

¿Sería más rápido:

  1. Cree una nueva tabla con la definición correcta para Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. Cambiar el nombre de OriginalTable a OriginalTable_old; Cambiar el nombre de NewTable a OriginalTable
  4. Validar y soltar OriginalTable_old

La ventaja aquí es que no mantiene un bloqueo en la tabla Original durante la duración de la operación. La tabla solo debe bloquearse durante la fase de cambio de nombre. (Se supone que SQL Server admite un cambio de nombre a nivel de objeto).

RobPaller
fuente
Sí, SQL Server admite cambios de nombre a nivel de objeto utilizando el procedimiento almacenado del sistema sp_rename.
gonsalu
Pude alterar una columna de esta manera con 3.5 millones de filas en 1 minuto.
Mohsen Afshin
2

Es necesario tocar cada fila al cambiar la columna de NOT NULL a NULL, por lo que se tarda tanto en completarse. No hay forma de hacer que tome menos tiempo.

mrdenny
fuente
1

Otra opción es crear una nueva columna con la definición correcta para la tabla en cuestión, actualizar la columna con los datos de la columna anterior y luego soltar la columna anterior.

O puede consultar una publicación anterior de SE que trata un problema similar en una columna INT.

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type

yrushka
fuente
En mi caso, mi columna está simplemente llena de NULL, así que creo que este sería el camino a seguir, crear una nueva columna completamente NULL con el nombre correcto no debería tomar tiempo en absoluto ... luego eliminar la columna anterior, en lugar de tratar con millones de inserciones ...
Zack
0

Si abre el monitor de actividad de SQL mientras se ejecuta el comando, podrá saber si realmente lo está procesando o si está esperando algún tipo de bloqueo exclusivo de la tabla.

Matthew Steeples
fuente