Изменение INT на BigInt - PullRequest
       5

Изменение INT на BigInt

28 голосов
/ 23 сентября 2009

У меня есть складская таблица с 16 тоннами данных. У меня есть несколько столбцов целых чисел в нем. Мы должны преобразовывать их в BIGINT для каждого запроса, который мы пишем, потому что SUM слишком велик, чтобы поместиться в INT.

Теперь у нас разрабатывается новый datamart. Поэтому мы подумали, почему бы не изменить все эти столбцы на BIGINT, и нам не о чем беспокоиться о новом наборе запросов.

Поскольку данные уже загружены, я решил использовать Management Studio и изменить тип данных. Но сначала я получаю предупреждение:

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.

Тогда я получаю ошибку:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Как мне обойти это?

Ответы [ 6 ]

50 голосов
/ 23 сентября 2009

Если один или несколько из этих столбцов не имеют никаких ограничений (например, внешний ключ, индекс, значение по умолчанию, правило и т. Д.), Вы сможете быстро изменить каждый из них, выполнив

ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint

SQL-запрос Management Studio редко бывает наиболее эффективным и имеет тенденцию отдавать предпочтение временным таблицам для всего, что модифицирует существующий столбец.

27 голосов
/ 23 сентября 2009

Не уверен, поможет ли это, но попробуйте это:

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
8 голосов
/ 18 марта 2014

Эта техника очень хорошо сработала для меня.

Я выполнил:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL

Это привело к этой ошибке, потому что на ключе было ограничение:

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.

Не подлежит сдерживанию, в SQL Server Management Studio Я щелкнул правой кнопкой мыши на ограничении PK_USER_USER_ID, затем выбрал «Ключ сценария как >> Удалить и создать в >> Новое окно редактора запросов»:

enter image description here

Это сгенерировало этот скрипт:

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

Затем я выполнил первую половину этого сценария, чтобы отбросить ограничение :

ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID]
GO

Теперь, когда ограничение исчезло, оригинальное изменение сработало:

use [Mytable]
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL

Затем я выполнил вторую половину сценария, чтобы добавить ограничение обратно в :

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
7 голосов
/ 23 сентября 2009

Я думаю, что главная ошибка, с которой вы можете столкнуться, заключается в том, что время ожидания истекло из-за GUI. Когда вы применяете большие изменения, используя выбор Modify из SSMS, время ожидания истекает. Если вы возьмете ту же команду, сгенерировав скрипт изменения в SSMS, а затем запустите прямой запрос SQL, она будет выполняться до завершения.

2 голосов
/ 15 июня 2011

Если исходные данные никогда не превышают предел INT, просто создайте VIEW, который передаст этот столбец в BIGINT и запросите его.

2 голосов
/ 23 сентября 2009

, чтобы расширить на OrbMan's ответ:

  • добавить новые столбцы внизу списка столбцов (это значительно ускорит его)
  • вы можете делать обновления в пакетах по 10000 строк или около того, при необходимости
  • убедитесь, что вы находитесь в однопользовательском режиме или в приложении, если "ВЫКЛ", чтобы никто не изменил данные в этой таблице

Кроме того, чтобы увидеть всю работу, которую Management Studio выполняет при изменении таблицы, щелкните значок панели инструментов, который выглядит как прокрутка с дискетой на нем. Это покажет фактические команды SQL, используемые для изменения вашей таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...