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 en otra tabla, soltar, crear, copiar 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.Cambiar los tipos de columna en una tabla enorme
Respuesta
Según el cambio que realice, a veces puede ser más fácil tomar una ventana de mantenimiento. Durante esa ventana (en la que nadie debería ser capaz de cambiar los datos en la tabla) se puede:
- caída de los índices/restricciones que apuntan a la columna de edad, y los disparadores desactivar
- añadir un nuevo columna anulable con el nuevo tipo de datos (incluso si debe ser NOT NULL)
- actualice la nueva columna configurándola igual al valor de la columna anterior (y puede hacerlo en fragmentos de transacciones individuales (por ejemplo, afectando a 10000 filas en una tiempo usando
UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL
) y con CHECKPOINT para evitar sobrepasar su registro) - Una vez que las actualizaciones se puede hacer todo, la caída de la antigua columna
- cambiar el nombre de la nueva columna (y añadir una restricción NOT NULL en su caso)
- reconstruir los índices y las estadísticas de actualización
La clave aquí es que le permite para realizar la actualización de forma incremental en el paso 3, lo cual no se puede hacer en un solo comando ALTER TABLE.
Esto supone que la columna no juega un papel importante en la integridad de los datos: si está involucrado en un conjunto de relaciones de claves externas, hay más pasos.
EDITAR
también, y sólo me preguntaba en voz alta, no he hecho ninguna prueba para esto (pero añadiendo a la lista). Me pregunto si la compresión de página + fila ayudaría aquí? Si cambia una INT a una BIGINT, con la compresión 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 tiempo más tomaría agregar compresión en primer lugar. Solo tirarlo ahí afuera.
La base de datos estará fuera de línea. ¿Establecer el modelo de recuperación a simple ayuda? – user1417408
En SIMPLE o FULL, su gran comando ALTER TABLE no será diferente, ya que todo se registra en ambos casos. Con lo anterior, SIMPLE podría ser un poco mejor, pero el modelo de recuperación no debería importar si elige un tamaño de lote apropiado. Además, si la base de datos está "fuera de línea" (supongo que no quiere decir ALTER DATABASE ... SET OFFLINE), ¿por qué la velocidad es importante? Lo anterior probablemente afeitaría un porcentaje del tiempo, pero no será alucinantemente más rápido. Lo que estás haciendo simplemente lleva tiempo. –
Aaron, gracias por su ayuda. La velocidad es importante porque el sitio que usa este DB solo estará fuera de línea durante unas horas. – user1417408
Si está utilizando algo como SQL Server Management Studio, 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: 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é.
- 1. Alteración del tipo de datos de una columna en una tabla ENORME. Rendimiento emite
- 2. Encontrar los tipos de datos de una tabla temporal SQL
- 3. Poblar una tabla enorme en la aplicación SWT/JFace RCP
- 4. MySQL: actualiza los datos de una sola tabla de una columna en otra columna
- 5. Cómo cambiar el tipo de datos de una columna de datos en una tabla de datos?
- 6. ¿Cómo puedo cambiar el nombre de una sola columna en una tabla en seleccionar?
- 7. Cómo cambiar una columna normal a la columna "calculada"
- 8. SQL actualiza una columna de otra columna en otra tabla
- 9. pandas: cómo cambiar todos los valores de una columna?
- 10. Oracle: ¿Hay alguna manera de obtener los tipos de datos de columna para una vista?
- 11. Cambiar el tipo de datos de una columna en Oracle
- 12. ¿Cómo cambiar el tipo de columna existente en una tabla en Sybase?
- 13. Tabla de sesión de Django enorme, comportamiento normal o error?
- 14. Cómo cambiar una columna sin eliminar una tabla en SQL 2008
- 15. Cómo cambiar una columna en Pandas DataFrame
- 16. Cambiar la propiedad editable de una columna de texto jqGrid basada en los resultados de una autocompleta en otra columna
- 17. ¿Cómo cambiar la posición de la columna de la tabla MySql sin perder los datos de la columna?
- 18. Cómo reemplazar una cadena en un SQL Server Tabla Columna
- 19. ¿Cómo ver los índices en una tabla en mysql workbench?
- 20. Viendo una tabla para cambiar en MySQL?
- 21. Mostrar los tipos de columna de resultados de consulta (PostgreSQL)
- 22. ¿Cómo puedo cambiar el nombre de mi columna en una tabla SQL?
- 23. SQL establece los valores de una columna igual a los valores de otra columna en la misma tabla
- 24. Cómo particionar una tabla MySQL basada en la columna char?
- 25. Valor de configuración para una columna de todos los registros en la tabla
- 26. Atravesar una columna de tabla -jQuery
- 27. Cómo subscribir una columna de tabla MySQL
- 28. Eliminar identidad de una columna en una tabla
- 29. Seleccionar texto en una columna de una tabla html
- 30. ¿Dónde encuentro los metadatos del servidor SQL para los tipos de datos de columna?
¿Puede explicar de qué está cambiando el tipo de datos desde y hacia? –
No veo cómo podría usar un cursor para cambiar el tipo de columna? Un tipo de columna es un cambio a _todos_ valores en una tabla. – Oded
ints to bigints – user1417408