sql - valor - Cambiar tipos de columnas en una tabla enorme
optimizar consultas lentas mysql (2)
Según el cambio que esté realizando, a veces puede ser más fácil tomar una ventana de mantenimiento. Durante esa ventana (donde nadie debería poder cambiar los datos en la tabla) puede:
- elimine los índices / restricciones que apuntan a la columna anterior y deshabilite los activadores
- agregue una nueva columna anulable con el nuevo tipo de datos (incluso si se pretende que NO sea NULL)
- actualice la nueva columna configurándola igual al valor de la columna anterior (y puede hacer esto en porciones de transacciones individuales (por ejemplo, afectando a 10000 filas a la vez usando
UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL
) y con CHECKPOINT para evitar anular su registro) - Una vez que las actualizaciones estén listas, suelte la columna anterior
- cambie el nombre de la nueva columna (y agregue una restricción NO NULA si corresponde)
- reconstruir índices y actualizar estadísticas
La clave aquí es que le permite realizar la actualización de manera incremental en el paso 3, lo que no puede hacer en un solo comando ALTER TABLE.
Esto supone que la columna no desempeña un papel importante en la integridad de los datos; si está involucrada en un grupo de relaciones de clave externa, hay más pasos.
EDITAR
Además, y solo preguntándome en voz alta, no he hecho ninguna prueba para esto (pero lo agregué a la lista). Me pregunto si la compresión de página + fila ayudaría aquí. Si cambia un INT a un BIGINT, con la compresión en su lugar, SQL Server aún debe tratar todos los valores como si aún encajaran en un INT. Nuevamente, no he probado si esto haría que un cambio fuera más rápido o más lento, o cuánto tiempo tomaría agregar compresión en primer lugar. Sólo tirarlo por ahí.
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 proceso? Estaba pensando en copiar los datos a otra tabla, soltar, crear, volver a copiar y cambiar al modo de recuperación simple o hacerlo de alguna manera con un cursor 1000 filas por vez, pero no estoy seguro de si eso llevará a alguna mejora.
Si está utilizando algo como SQL Server Management Studio, simplemente vaya a la tabla en la base de datos, haga clic con el botón derecho, seleccione ''Diseño'' y luego elija la columna que desea editar: configúrela 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 fuera de int en bigint, pero no cambiará los datos existentes por lo que sé.