sql - usar - Cambiando INT a BigInt
valores flotantes en sql (6)
Creo que el principal error con el que te estás encontrando es que la GUI es lo que se está agotando. Cuando aplique un gran cambio utilizando la selección Modificar desde SSMS, se agotará el tiempo de espera. Si toma el mismo comando al generar el script de cambio en SSMS y luego ejecutarlo como una consulta SQL directa, se ejecutará hasta que se complete.
Tengo una mesa de almacén con 16 toneladas de datos en ella. Tengo algunas columnas enteras en él. Tenemos que convertirlos en BIGINT para cada consulta que escribamos, porque el SUM es demasiado grande para caber en un INT.
Ahora tenemos un nuevo datamart en desarrollo. Así que pensamos, ¿por qué no cambiamos todas estas columnas a BIGINT y tenemos menos de qué preocuparnos por el nuevo conjunto de consultas?
Como los datos ya están cargados, pensé que usaría Management Studio y cambiaría el tipo de datos. Pero primero recibo una advertencia:
Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.
Entonces me sale un error:
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
¿Cómo puedo solucionar esto?
Esta técnica funcionó muy bien para mí.
Yo ejecuté
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Esto dio lugar a este error porque había una restricción en la clave:
Msg 5074, Level 16, State 1, Line 2
The object ''PK_USER_USER_ID'' is dependent on column ''USER_ID''.
Msg 4922, Level 16, State 9, Line 2
ALTER TABLE ALTER COLUMN USER_ID failed because one or more objects access this column.
Para no ser disuadido, en SQL Server Management Studio hice clic derecho en la restricción PK_USER_USER_ID, luego seleccioné "Script key as >> Drop and Create To >> New Query Editor Window":
Esto generó este script:
USE [Database]
GO
/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/
ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Luego ejecuté la primera mitad de este script, para eliminar la restricción :
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO
Ahora que la restricción había desaparecido, el cambio original funcionó muy bien:
use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL
Luego ejecuté la segunda mitad del script, para volver a agregar la restricción en :
ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED
(
[USER_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
No estoy seguro de si esto ayudará, pero intente esto:
1 - create a new bigint column in the table
2 - update that new column with the values from the int column
3 - delete the int column
4 - rename the bigint column
Si los datos de origen nunca superan el límite de INT, simplemente haga una VISTA que suba esa columna a BIGINT y pregunte por eso.
Si una o más de esas columnas no tienen restricciones en su contra (como una clave externa, índice, valor predeterminado, regla, etc.), debería poder cambiar cada una rápidamente haciendo
ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint
El cambio SQL de Management Studio rara vez es el más eficiente y tiende a favorecer las tablas temporales para cualquier cosa que modifique una columna existente.
para ampliar OrbMan''s respuesta OrbMan''s :
- agregue las nuevas columnas al final de la lista de columnas (esto lo acelerará mucho)
- puede hacer sus actualizaciones en lotes de 10,000 filas o menos si es necesario
- asegúrese de estar en modo de usuario único o de la aplicación si está "DESACTIVADO" para que nadie más cambie los datos en esa tabla
Además, para ver todo el trabajo que realiza Management Studio cuando cambia una tabla, haga clic en el icono de la barra de herramientas que parece desplazarse con un disquete. Esto mostrará los comandos SQL reales utilizados para alterar su tabla.