Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Как быстро скопировать таблицу в той же базе?  [new]
aleks222
Guest
set identity_insert [dbo].[x2] on

insert [dbo].[x2] with(tablockx) (session_id, node_id, id) select session_id, node_id, id from [dbo].[x1];

set identity_insert [dbo].[x2] off
15 авг 17, 06:01    [20723749]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
автор
Что, серьезно считаете, что NOLOCK как-то повлияет на целевую таблицу?

даже больше, с какой-то версии это вообще игнорируется DE, и наверное с 2012 вообще в ошибку выпадет
15 авг 17, 09:29    [20723967]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
invm
считаете, что NOLOCK как-то повлияет на целевую таблицу?

Чего-то я сглюкнул ... конечно же с точностью до наоборот, надо полную блокировку ставить
15 авг 17, 09:29    [20723968]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Mr. X
Guest
Ролг Хупин,

Существующую табл изменить не вариант?
15 авг 17, 13:31    [20724942]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3436
Mr. X
Ролг Хупин,

Существующую табл изменить не вариант?


я бы изменил, если было бы можно сделать из существующего поля с существующими данными

int IDENTITY(1,1)
на
bigint IDENTITY(1,1)

Т.е. задача в том, чтобы сделать такую замену на таблице с тучей данных и чем быстрее будет операция, тем лучше.
Вот и ищу пути.

Там даже веселее: на одной из 6 таблиц уже было переполнение и я руками двинул начало счетчика в -минимум
15 авг 17, 13:53    [20725031]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Ролг Хупин,

добавиь колонку, отключить идентити, перенести с 1 - > 2, включить идентити, удалить 1, переименовть 2
15 авг 17, 13:54    [20725036]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Mr. X
Guest
Ролг Хупин,

ALTER TABLE T1 ALTER COLUMN id type_name bigint

Детали: If the modified column is an identity column, new_data_type must be a data type that supports the identity property.
15 авг 17, 16:24    [20725787]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
Mr. X
type_name


лишнее
15 авг 17, 16:29    [20725818]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
О хоспаде, ну нельзя "включить" identity на существующем поле. И апдейтить identity не выйдет своими значениями, только новые записи можно вставлять с нужным значением.

Автор, переползайте на сиквенсы (если версия позволяет) пока не поздно, подобного гемороя станет меньше.
15 авг 17, 16:31    [20725822]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
Mr. X
ALTER TABLE T1 ALTER COLUMN id type_name bigint
Может оказаться, что перелить балком будет быстрее, чем в один поток переколбашивать всю таблицу. Особенно в случае отсутствия свободного места на страницах.
15 авг 17, 16:36    [20725845]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Гавриленко Сергей Алексеевич,

+ на больших объёмах да ещё и при наличии констрейнов это будет просто адски долго
15 авг 17, 16:37    [20725853]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Гавриленко Сергей Алексеевич
И апдейтить identity не выйдет своими значениями, только новые записи можно вставлять с нужным значением.

Неправда Ваша, можно "апдейтить identity ... своими значениями"
15 авг 17, 16:39    [20725859]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Невский
Member

Откуда:
Сообщений: 30
Ролг Хупин
я бы изменил, если было бы можно сделать из существующего поля с существующими данными

int IDENTITY(1,1)
на
bigint IDENTITY(1,1)

Т.е. задача в том, чтобы сделать такую замену на таблице с тучей данных и чем быстрее будет операция, тем лучше.
Вот и ищу пути.


А почему это невозможно? Я ради интереса попробовал:

CREATE TABLE [Test1](
[Id] [int] IDENTITY(1,1)
,[Pole1] bigint
)

insert into [Test1] ([Pole1])
select top 1000000 1
from [Большая таблица]

alter table [Test1] alter column [Id] [bigint]

insert into [Test1] ([Pole1]) values(2)

select max(ID) from [Test1] where [Pole1]=1
select ID from [Test1] where [Pole1]=2

Результаты:
1000000
1000001

Отработалось быстро. Но я вставил всего миллион записей, не знаю сколько займет времени для миллиарда...
15 авг 17, 16:42    [20725872]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Невский,

а дальше вы будете +1 делать? или идентити само появится?

автор
Неправда Ваша, можно "апдейтить identity ... своими значениями"

научите
15 авг 17, 16:46    [20725884]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
Yuri Abele
Гавриленко Сергей Алексеевич
И апдейтить identity не выйдет своими значениями, только новые записи можно вставлять с нужным значением.

Неправда Ваша, можно "апдейтить identity ... своими значениями"
Это как же?

UPD. Хотя можно сделать "update" через delete / insert с identity_insert, но не прямой update.

Сообщение было отредактировано: 15 авг 17, 16:48
15 авг 17, 16:46    [20725885]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
invm
Member

Откуда: Москва
Сообщений: 9113
Невский
А почему это невозможно? Я ради интереса попробовал
А теперь добавьте PK на id и попробуйте еще раз.
15 авг 17, 16:48    [20725901]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Гавриленко Сергей Алексеевич,

identity_insert не считается?
15 авг 17, 16:49    [20725902]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
А, понял, речь идет об update.
15 авг 17, 16:49    [20725910]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
Владислав Колосов
Гавриленко Сергей Алексеевич,

identity_insert не считается?

Мы как бы про update говорим, а не про insert.
15 авг 17, 16:49    [20725911]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Невский
Member

Откуда:
Сообщений: 30
TaPaK
Невский, а дальше вы будете +1 делать? или идентити само появится?


В смысле? Я вставил в строку 1000001 значение только в поле [Pole1] (двойку) затем выбрал из таблицы значения ID для 1 и для 2. Как видим для [Pole1]=2 результат 1000001. Я его не вставлял. Если бы счетчик отключился, то было бы Null или левое значение, если бы он стал работать неправильно
15 авг 17, 16:50    [20725915]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
Невский
TaPaK
Невский, а дальше вы будете +1 делать? или идентити само появится?


В смысле? Я вставил в строку 1000001 значение только в поле [Pole1] (двойку) затем выбрал из таблицы значения ID для 1 и для 2. Как видим для [Pole1]=2 результат 1000001. Я его не вставлял. Если бы счетчик отключился, то было бы Null или левое значение, если бы он стал работать неправильно
Альтерить тип identity-поля можно, но это самый медленно работающий способ, потому что SQL Server не любит (или не может) параллелить операции по изменению схемы, потому что операцию нельзя сделать минимально протоколируемой и потому что могут быть расщепления страниц.
15 авг 17, 16:53    [20725922]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Невский,

добавьте пару/десяток референсов и тп доведите хоть до десяков млн записей и стартруййте alter.
15 авг 17, 16:55    [20725929]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
Что касается сабжа, то решить задачу с минимальным простоем для пользователей можно только через новую таблицу с lazy-переливкой туда данных и последующей подменой таблиц. При этом синхронность данных на время существования обеих таблиц придется поддерживать кодом.
15 авг 17, 16:56    [20725933]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36684
TaPaK
Невский,

добавьте пару/десяток референсов и тп доведите хоть до десяков млн записей и стартруййте alter.
С зависимыми от поля объектами есть шанс, что сервер вообще откажется делать alter. Индексы вот придется снести.
15 авг 17, 17:03    [20725965]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Невский
Member

Откуда:
Сообщений: 30
TaPaK
Невский, добавьте пару/десяток референсов и тп доведите хоть до десяков млн записей и стартруййте alter.

Так я и не говорю, что это самый быстрый способ. Наоборот, уверен что пересоздание будет быстрее. Просто автор усомнился, что существующее поле можно обновить, а я проверил на практике, что это возможно.
p.s. Да, если это поле PK, то алтер не сработает.
15 авг 17, 17:05    [20725971]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить