Cambiar los types de columnas en una tabla enorme

Tengo una tabla en SQL Server 2008 R2 con cerca de mil millones de filas. Quiero cambiar el tipo de datos de dos columnas de int a bigint. Dos veces ALTER TABLE zzz ALTER COLUMN yyy funciona, pero es muy lento. ¿Cómo puedo acelerar el process? Estaba pensando en copyr los datos en otra tabla, soltar, crear, copyr de nuevo y cambiar al modo de recuperación simple o de alguna manera hacerlo con un cursor de 1000 filas por vez, pero no estoy seguro de si realmente se logrará alguna mejora.

Dependiendo de qué cambio esté realizando, a veces puede ser más fácil tomar una window de mantenimiento. Durante esa window (donde nadie debería poder cambiar los datos en la tabla) puede:

  1. descartar los índices / restricciones que apuntan a la columna anterior y deshabilitar los desencadenantes
  2. agregue una nueva columna que admite valores NULL con el nuevo tipo de datos (incluso si debe ser NOT NULL)
  3. actualice la nueva columna configurándola igual al valor de la columna anterior (y puede hacer esto en fragments de transactions individuales (digamos, afectando 10000 filas a la vez usando UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL ) y con CHECKPOINT para evitar sobrepasar su logging)
  4. una vez que todas las actualizaciones hayan terminado, descarte la columna anterior
  5. cambie el nombre de la nueva columna (y agregue una restricción NOT NULL si corresponde)
  6. rebuild índices y actualizar statistics

La key aquí es que le permite realizar la actualización de forma incremental en el paso 3, lo que no puede hacer en un solo command ALTER TABLE.

Esto supone que la columna no está desempeñando un papel importante en la integridad de los datos: si está involucrado en un set de relaciones de keys externas, hay más pasos.

EDITAR

Además, y solo me pregunto en voz alta, no he hecho ninguna testing para esto (pero lo he agregado a la list). Me pregunto si la compression de página + fila ayudaría aquí? Si cambia una INT a una BIGINT, con la compression en su lugar SQL Server debería tratar todos los valores como si todavía encajaran en una INT. Una vez más, no he probado si esto haría que un cambio sea más rápido o más lento, o cuánto time más tomaría agregar compression en primer lugar. Solo tirarlo ahí afuera.

Si está utilizando algo como SQL Server Management Studio, vaya a la tabla en la database, haga clic con el button derecho, select 'Diseño' y luego elija la columna que desea editar: establézcalo en bigint y presione Guardar. Cambia toda la columna, pero los valores anteriores permanecerán como están. Esto es bueno para permitir que una tabla 'crezca' de int a bigint, pero no cambiará los datos existentes hasta donde yo sé.