Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как доабвить identity поле в существующую таблицу?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Есть исходная таблица, строю новую, чтобы ускорить делаю так:

select * into t_new from t_old;


далее нужно новое поле int_id в t_new, которое бы содержало уникальные целые числа, кроме identity вариантов не вижу,
чтобы быстро заполнить большую таблицу

 alter table t_new add int_id int not null identity(1,1)


работает уже минут 30 на 100 млн записей и когда завершится непонятно.....

Как сделать такое же, но быстро?
15 апр 13, 17:23    [14183270]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Может, так?
select identity(int,1,1) as int_id, * into t_new from t_old;
15 апр 13, 17:30    [14183315]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Winnipuh
Как сделать такое же, но быстро?

Так надо было сначала спросить, а потом запускать
15 апр 13, 17:32    [14183326]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh
Как сделать такое же, но быстро?

Так надо было сначала спросить, а потом запускать


100%



а теперь откат столько же идет
15 апр 13, 17:35    [14183346]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
Proavtor
Member

Откуда: Москва
Сообщений: 10
"Быстро заполнить большую таблицу" , к сожалению, не всегда возможно. Но можно свести к минимуму возможные негативные последствия, такие как блокировки, нехватку памяти и тп.
Сначала добавить null поле:

alter table [table name]
add id_new int null


А затем уже организовать цикл UPDATE id_new пачками по N-записей, N при этом подбирается экспериментально, в зависимости от загрузки, технических характеристик сервера и тп., таким образом, чтобы очередь из возникавших в течении этого процесса блокировок, не превышала обычную в 3-4 раза.
Цикл может выглядеть таким, например, образом:

set nocount on;

declare @N int = 1000
declare @id_max int, @cnt int;

select @id_max = isnull(max(id_new), 0), @cnt = COUNT(*) from [table name];

while @id_max < @cnt and @cnt > 0
begin
	update top(@N) [table name]
	set @id_max = id_new = @id_max + 1
	where id_new is null;
end


если в процессе будет происходить сторонняя вставка, следует добавить
select @id_max = isnull(max(id_new), 0), @cnt = COUNT(*) from [table name] where id_new is not null;

перед end, правда в этом случае наш updare будет выполняться в разы дольше.

Такой запрос можно смело запускать, лопатить будет, возможно, долго, но точно не повесит базу.
15 апр 13, 20:23    [14183995]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Proavtor,

Если честно, то жесть какая-то, и не гарантирует уникальность.
С чем соглашусь, базу не повесит, но и задачи не решит.
15 апр 13, 21:15    [14184123]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Proavtor
Такой запрос можно смело запускать, лопатить будет, возможно, долго, но точно не повесит базу.
Это не решает задачи "Как доабвить identity поле"

В принципе ответ уже сказал Гость333, должно получиться, так как просто переливка в новую таблицу заняла у ТС приемлимое время.

Можно ещё использовать row_number и identity insert on.

Если бы таблица была большая, и перелить было бы нельзя, то можно сделать так:

1. делаем новую таблицу
2. делаем триггер для старой таблицы для поддержания синхронности обновляемых данных
3. небольшими порциями переливаем данные (хоть неделю)
4. после переливки удаляем триггер, старую таблицу, новую переименовываем в старую

Я делал такие переливки для больших таблиц, ещё и серверы были связаны не очень быстрым каналом, но наверное в данном случае это всё избыточно.
15 апр 13, 21:38    [14184180]     Ответить | Цитировать Сообщить модератору
 Re: Как доабвить identity поле в существующую таблицу?  [new]
Proavtor
Member

Откуда: Москва
Сообщений: 10
Да, и вправду не решает, увлекся чуток) просто очень похожа на задачу, которая возникала когда то у меня, была огромная таблица, нужно было ее пронумеровать и при этом не по чему было сортировать, и большой даунтайм был не позволителен.
Предложенный alexeyvg хороший, годный способ, если есть ключ и есть по чему сортировать. Возьму на заметку)
17 апр 13, 12:24    [14191807]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить