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

Откуда: Чебаркуль
Сообщений: 3708
Есть большая талица, 500 000 000 записей

create table x
(
id int not null identity(1,1) primary key,
name nvarchar(MAX),
type int
)


Надо изменить
id int not null identity(1,1) ->id bigint not null identity(1,1),

Этот работает, но часов 15, а это нехорошо:

alter table [dbo].[x] alter column id bigint;


Как сделать быстрее?
30 авг 17, 10:31    [20757950]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Ролг Хупин
Как сделать быстрее?
Залить балком в новую таблицу правильной структуры.
Старую удалить.
Новую переименовать.
30 авг 17, 10:56    [20758052]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Как вариант - залить в новую таблицу по небольшим кусочкам, если позволяет структура (интервалы дат, ключей).
В последний момент залить последний кусочек, старую таблицу удалить/переименовать, новую переименовать в старую.
Удар по производительности будет минимальный.
Как ни крути 500млн, но это не может быть быстрым процессом.
30 авг 17, 11:01    [20758078]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
А RI восстанавливать не надо?!
Если надо, то придётся проделать то же самое в таблицах, ссылающихся на первую. И так далее рекурсивно.

Пересоздание приведёт также к необходимости восстановления прав доступа.
30 авг 17, 11:22    [20758169]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
iap
А RI восстанавливать не надо?!
Если надо, то придётся проделать то же самое в таблицах, ссылающихся на первую. И так далее рекурсивно.

Пересоздание приведёт также к необходимости восстановления прав доступа.


Надо, надо.... там в сумме в талицах (мастер-детайлз), где надо изменить этот тип - 1 млрд записей.
Юзеры столько не проживут в ожидании

Надо что-то крадинальное и быстрое.
30 авг 17, 12:22    [20758352]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Ролг Хупин
iap
А RI восстанавливать не надо?!
Если надо, то придётся проделать то же самое в таблицах, ссылающихся на первую. И так далее рекурсивно.

Пересоздание приведёт также к необходимости восстановления прав доступа.


Надо, надо.... там в сумме в талицах (мастер-детайлз), где надо изменить этот тип - 1 млрд записей.
Юзеры столько не проживут в ожидании

Надо что-то крадинальное и быстрое.
Значит, надо начать с дропанья Foreign Keys в надежде когда-нибудь их снова создать.
Так что в самом начале их надо заскриптовать.
И постепенно менять типы в таблицах переливанием в новые таблицы с их переименованием и назначением прав доступа.
Кстати, и про триггеры надо не забыть.
30 авг 17, 12:30    [20758382]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
Ролг Хупин
Надо что-то крадинальное и быстрое.

квантовые вычисления!
30 авг 17, 12:42    [20758426]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
Ролг Хупин
Member

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


Надо, надо.... там в сумме в талицах (мастер-детайлз), где надо изменить этот тип - 1 млрд записей.
Юзеры столько не проживут в ожидании

Надо что-то крадинальное и быстрое.
Значит, надо начать с дропанья Foreign Keys в надежде когда-нибудь их снова создать.
Так что в самом начале их надо заскриптовать.
И постепенно менять типы в таблицах переливанием в новые таблицы с их переименованием и назначением прав доступа.
Кстати, и про триггеры надо не забыть.


100%

Но крутил и так, и сяк, и копированием на новое место, и изменением типа в таблице по-живому с инт на бигинт - долго.
Кстати, изменил ntext на nvarchar(MAX) - 2 секунды на сотнях млн записей.
Выходит, что при измененнии типа с фиксированной длиной меняются по всем данным.

В обще - в прострации сейчас, ищу пути ;-)
30 авг 17, 12:42    [20758429]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Ролг Хупин
Но крутил и так, и сяк, и копированием на новое место, и изменением типа в таблице по-живому с инт на бигинт - долго.
Так какие проблемы, если с переливкой?
Переливаете в цикле порциями, на исходную таблицу триггер для синхронизации.
Я так неделю переливал, помню, менял ПК с GUID на bigint в большой базе (конечно, в группе таблиц, а не в одной), пользователи и не заметили :-)
30 авг 17, 14:22    [20758823]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
o-o
Guest
Ролг Хупин
Кстати, изменил ntext на nvarchar(MAX) - 2 секунды на сотнях млн записей.

потому что данные даже вообще не трогались.
т.е. они как были LOB, так и остались LOB. шило на мыло.
только для новых записей он будет пытаться разместить в виде IN-ROW.
---
а вот если бы он и правда начал лопатить ntext и пытаться его в строке разместить,
смена int на bigint показалась бы цветочками
30 авг 17, 14:27    [20758849]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
rnk
Member

Откуда:
Сообщений: 126
Ролг Хупин
изменением типа в таблице по-живому с инт на бигинт - долго.
Кстати, изменил ntext на nvarchar(MAX) - 2 секунды на сотнях млн записей.

Удалить Primary Key, потом сделать ALTER COLUMN, потом заново создать Primary Key.
31 авг 17, 15:55    [20762333]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
o-o
Guest
rnk
Ролг Хупин
изменением типа в таблице по-живому с инт на бигинт - долго.
Кстати, изменил ntext на nvarchar(MAX) - 2 секунды на сотнях млн записей.

Удалить Primary Key, потом сделать ALTER COLUMN, потом заново создать Primary Key.

500 000 000?
сперва превратить в кучу (Удалить Primary Key),
затем засплитить все страницы ( сделать ALTER COLUMN), ибо bigint больше int места занимает,
а затем (заново создать Primary Key) снова отсортировать все 500 000 000?

кроме того, что это гораздо дольше, чем просто перезалить уже имеющееся и отсортированное,
так оно при сортировке наверняка вывалит ошибку переполнения диска,
либо того, что с данными, либо темпдб, если при создании ПК указать sort in tempdb.
---
переливать хотя бы частями можно,
а вот все вами предложенное -- это 1 транзакция на 1 действие.
попробуй прерви.
31 авг 17, 16:23    [20762400]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
o-o
rnk
пропущено...

Удалить Primary Key, потом сделать ALTER COLUMN, потом заново создать Primary Key.

500 000 000?
сперва превратить в кучу (Удалить Primary Key),
затем засплитить все страницы ( сделать ALTER COLUMN), ибо bigint больше int места занимает,
а затем (заново создать Primary Key) снова отсортировать все 500 000 000?

кроме того, что это гораздо дольше, чем просто перезалить уже имеющееся и отсортированное,
так оно при сортировке наверняка вывалит ошибку переполнения диска,
либо того, что с данными, либо темпдб, если при создании ПК указать sort in tempdb.
---
переливать хотя бы частями можно,
а вот все вами предложенное -- это 1 транзакция на 1 действие.
попробуй прерви.


в том-то и проблема, на не таких больших базах в принципе работало, долго, но приемлемо, а когда взял пару больших - тут-то кырдык и проявился.
Да, ты прав, и роллбэк в случае облома тоже..
Кроме того, если у юзера не хватит места в базе, на диске или в темпдб - обломается посреди преобразования.

Надо делать рядом такие же таблицы, старые оставлять в режиме ридонли, в новые писать, из обеих частей читать.
Мутно тоже, но не так стремно.
1 сен 17, 09:35    [20763665]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Так может, вообще сделать новую базу с правильными таблицами,
останется только их заполнить, дропнуть старую базу, новую переименовать?
1 сен 17, 11:02    [20763953]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
iap
Так может, вообще сделать новую базу с правильными таблицами,
останется только их заполнить, дропнуть старую базу, новую переименовать?


заполнение будет сутками идти на таких больших базах, и темпдб треснет, и юзеры повесятся

Я померил - дропанье П и Ф ключей - проходит, но преобразование полей инт в бигинт - писец, и как правилльно заметил о-о - кусками не сделаешь...
Получается надо делать набор таблиц 2, и как я написал - юзить параллельно.
Придется переписать процедуры, триггеры, но зато не будет сутками преобразовывать.
1 сен 17, 11:12    [20763989]     Ответить | Цитировать Сообщить модератору
 Re: Изменить тип в большой таблице  [new]
o-o
Guest
[quot Ролг Хупин]
iap
Я померил - дропанье П и Ф ключей - проходит, но преобразование полей инт в бигинт - писец

ладно бы еще только преобразовывать.
если бы затея удалась, писец N2 пришел бы при попытке навесить ПК на такую здоровенную кучу.
отсортировать 500 000 000 строк в один прием это "дай бог каждому"
1 сен 17, 11:34    [20764050]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить