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

Откуда: Чебаркуль
Сообщений: 4441
Тема уже была здесь несколько раз, но актуальна.
Итак, вопрос:

Есть большая таблица с ПК int identity, которых скоро захлебнется.
Как заменить его на bigint identity не спрашиваю, уже было и сам делал.

Как заменить его на Sequence в существующей таблице? может это более простая замена для рабочей базы?
23 ноя 21, 12:40    [22399613]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Ролг Хупин
Тема уже была здесь несколько раз, но актуальна.
Итак, вопрос:

Есть большая таблица с ПК int identity, которых скоро захлебнется.
Как заменить его на bigint identity не спрашиваю, уже было и сам делал.

Как заменить его на Sequence в существующей таблице? может это более простая замена для рабочей базы?

Сбросьте Identity на минимальное отрицательное значение и оставьте проблему будущим поколениям.
:-)

Сообщение было отредактировано: 23 ноя 21, 13:24
23 ноя 21, 13:24    [22399649]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4441
uaggster
Ролг Хупин
Тема уже была здесь несколько раз, но актуальна.
Итак, вопрос:

Есть большая таблица с ПК int identity, которых скоро захлебнется.
Как заменить его на bigint identity не спрашиваю, уже было и сам делал.

Как заменить его на Sequence в существующей таблице? может это более простая замена для рабочей базы?

Сбросьте Identity на минимальное отрицательное значение и оставьте проблему будущим поколениям.
:-)


"Главное в следственных действиях - это не выйти на самих себя."

Эх, уже сделал когда-то,но парадокс в том, что я получился тем самым будущим поколением.
Скоро п-ц, вот и думаю
23 ноя 21, 13:35    [22399661]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6254
Ролг Хупин
Как заменить его на bigint identity не спрашиваю, уже было и сам делал.
Как заменить его на Sequence в существующей таблице? может это более простая замена для рабочей базы?

Точно так же, как и для замены identity, только в случае sequence для колонки с id нужно задавать не identity specification, а default constraint, который будет при вставке подставлять в id next value из сиквенса:
-- было
create table test.test (
  n int identity not null primary key,
  name varchar(10) not null
)
go
-- стало
create table test.test (
  n int not null primary key default(next value for test.sq_test) ,
  name varchar(10) not null
)
go

Разумеется, для второго случая сиквенс уже должен быть создан.
23 ноя 21, 14:53    [22399701]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Ролг Хупин,

Может, сделать IDENTITY DEC(38,0)??
До конца Земли должно хватить
23 ноя 21, 15:01    [22399704]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Ролг Хупин
Member

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

Может, сделать IDENTITY DEC(38,0)??
До конца Земли должно хватить


в живой таблице с хх млн записей пройдет по-быстрому?
23 ноя 21, 15:03    [22399705]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
use tempdb;
go

create table dbo.t (id int identity constraint PK_t primary key (id), a int);
insert into dbo.t (a) select top (10) object_id from sys.objects where object_id > 0;
select id, a from dbo.t order by id;
go

alter table dbo.t drop constraint PK_t;
go

alter table dbo.t alter column id bigint not null;
alter table dbo.t add constraint PK_t primary key (id);
insert into dbo.t (a) select top (1) -object_id from sys.objects where object_id > 0;
select id, a from dbo.t order by id;
go

drop table dbo.t;
go
23 ноя 21, 15:12    [22399715]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Ага. И не дай бог это куда-то на клиент тянется.
Если нет - то, в принципе - возможно.
А если да - то, в общем случае - не решаемо. Т.к. замена PK в основной и FK в дочерних таблицах не приведет к замене размера этих полей на уровне модели данных в исходном коде клиента.
В итоге, в аналогичном случае, мы просто забекапили старую базу, а новую - начали с нуля.

Сообщение было отредактировано: 23 ноя 21, 15:44
23 ноя 21, 15:41    [22399737]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4441
uaggster
Ага. И не дай бог это куда-то на клиент тянется.
Если нет - то, в принципе - возможно.
А если да - то, в общем случае - не решаемо. Т.к. замена PK в основной и FK в дочерних таблицах не приведет к замене размера этих полей на уровне модели данных в исходном коде клиента.
В итоге, в аналогичном случае, мы просто забекапили старую базу, а новую - начали с нуля.


вот-вот, я приблизительно об этом
23 ноя 21, 18:03    [22399848]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
uaggster
Т.к. замена PK в основной и FK в дочерних таблицах не приведет к замене размера этих полей на уровне модели данных в исходном коде клиента.
А замена на bigint sequence приведет?
23 ноя 21, 18:36    [22399875]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
Ролг Хупин
uaggster
замена PK в основной и FK в дочерних таблицах не приведет к замене размера этих полей на уровне модели данных в исходном коде клиента.

вот-вот, я приблизительно об этом
Если вопрос в этом, а не из стартового топика, то понятно, что одним кликом это не решается.
Нужно постепенно отрефакторить клиента, а потом уже менять базу.
Но, в общем, ничего особенно фантастического и нерешаемого тут нет, однако потребуется поработать некоторое время (но всё таки меньше, чем ещё раз создать подобную систему).
Помню, как то делал изменение ИД с guid на bigint в большой загруженной базе, разработка заняла месяц, потом сам процесс перехода месяц, конечно, без остановки сервиса.
23 ноя 21, 19:52    [22399911]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Ролг Хупин
Member

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

вот-вот, я приблизительно об этом
Если вопрос в этом, а не из стартового топика, то понятно, что одним кликом это не решается.
Нужно постепенно отрефакторить клиента, а потом уже менять базу.
Но, в общем, ничего особенно фантастического и нерешаемого тут нет, однако потребуется поработать некоторое время (но всё таки меньше, чем ещё раз создать подобную систему).
Помню, как то делал изменение ИД с guid на bigint в большой загруженной базе, разработка заняла месяц, потом сам процесс перехода месяц, конечно, без остановки сервиса.


ясно, и вопрос - что лучше: sequence или identity? стоит заморачиваться с заменой i на s в принципе?
24 ноя 21, 11:36    [22400108]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
Ролг Хупин
и вопрос - что лучше: sequence или identity? стоит заморачиваться с заменой i на s в принципе?
Вот этого не знаю, сиквенсов никогда не использовал, в силу привычки.
24 ноя 21, 19:44    [22400392]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Владислав Колосов
Member

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

identity должно побыстрее работать, я так думаю.
24 ноя 21, 21:14    [22400414]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4441
alexeyvg
Ролг Хупин
и вопрос - что лучше: sequence или identity? стоит заморачиваться с заменой i на s в принципе?
Вот этого не знаю, сиквенсов никогда не использовал, в силу привычки.


аналогично, но тяга к знаниям.
Есть там +: sequence можно альтернуть по-живому, не все, но что-то изменть: мин, макс, старт, шаг.
Кроме того, есть какой-то кеш. На больших базах должен быть выигрыш
25 ноя 21, 11:19    [22400576]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
tunknown
Member

Откуда:
Сообщений: 819
Ролг Хупин
в живой таблице с хх млн записей пройдет по-быстрому?
Вам предложили отрицательные значения и это уже сделано, как я понял. Тогда количество записей в этой таблице приближается к 4.2 млрд, а не к XX миллионам. Если на эту таблицу ссылается другая таблица, то там эта проблема уже решена и это решение, возможно, стоит повторить. Если же на эту таблицу не ссылается другая таблица, то в ней не нужен PK(identity), а достаточно любого кластерного индекса, пусть и неуникального. А рефакторингом решить остальную часть проблемы, например, удаление по условию вместо primary key перевесить на unique constraint. Можно схлопнуть и дырки identity, если там конструктивно +1, а не +10. Хотя работы, возможно, будет несколько больше.
25 ноя 21, 11:49    [22400604]     Ответить | Цитировать Сообщить модератору
 Re: Замена Identity в больших таблицах  [new]
Владислав Колосов
Member

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

автор
Кроме того, есть какой-то кеш

Identity также имеет кэш, но неуправляемый.
25 ноя 21, 12:08    [22400616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить