Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
Доросла моя база до уровня распределённой. В связи с чем возникла проблема настройки репликации. сейчас все связи держатся на PK (identity int) - FK (int). Планирую заменить их на GUID (uniqueidentifier) по такому алгоритму:
1. добавить по новой колонке GUID - это будущий PK, значение сгенерится автоматом
2. добавить для каждого FK по колонке ..._GUID.
3. заполнить значения внешних ключей с GUID'aми по имеющимся integer ключам
4. создать связи по новым колонкам с GUID
5. удалить связи по старым колонкам с identity int
6. удалить старые колонки с PK/FK
7. переименовать колонки с GUID в ID (это чтобы все ХП, вьюхи и приложение не развалилось)
8. что-то как всегда забыл

В связи с этим есть вопросы:
1. есть ли какие-то тулзы делающие это автоматом ?
2. что использовать вместо @@identity ? т.е. как получить значение свежевставленного GUID'a?
3. ну и критика конструктивная приветствуется

Разносить вручную диапазоны идентити не предлагать: пилотный проект - 7 удалённых серверов, потом увеличим до 40. каждому вручную это настраивать - нет не сил не желания.
4 мар 05, 13:56    [1363670]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Все правильно описано.

Тулзей нету.

Значение только что вставленного получать не надо. Если оно вам нужно, что генерите его ДО вставки и используйте. newid(). Вам не придется заботиться о параллельных коннектах, потому что newid() генерит уникальное значение.

Диапазоны - лесом, совершенно поддерживаю. Если доросло до репликации, то однозначно надо на GUID переходить.
4 мар 05, 14:04    [1363724]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Артем1
Member

Откуда: www.desnogorsk.{ru||net} -> Москва
Сообщений: 2036
еще в хп в параметрах и в переменных в триггерах int-ы на guid-ы заменить
4 мар 05, 14:16    [1363803]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
otto kreiz
Guest
А что про программы на стороне клиента никто ничего не сказал? Их ведь тоже переделывать надо!
4 мар 05, 14:33    [1363910]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
с ХП понятно
с клиентской программой тоже

какие ещё будут предложения?
4 мар 05, 14:41    [1363953]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
timda
Member

Откуда: Россия
Сообщений: 579
1. разве обязательно для репликации использовать ГУИДы ?
2. по производительности сильно потерять нельзя на этих ГУИДах?

timda.ru
4 мар 05, 14:44    [1363972]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
а какой способ генерации нового ИД предложите вы?
4 мар 05, 14:48    [1363995]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Артем1
Member

Откуда: www.desnogorsk.{ru||net} -> Москва
Сообщений: 2036
Есть же еще вариант добавления столбца с признаком филиала. Не рассматривали? По трудоемкости вряд-ли сложнее переходна на GUID.
4 мар 05, 14:51    [1364010]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
а кто этот столбец будет заполнять?
4 мар 05, 15:36    [1364286]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Сравнение производительности гуидов и интов в качестве PK - ищите на форуме, было. Очень хорошие треды были.

Поищите на форуме страдания любителей интовых ключей для репликации. И с разделением диапазонов, и с составным ключом. Не устаю эгоистично радоваться за себя, читая эти топики. Гуид - и затраты на сопровождение репликации снижаются на порядок. А затраты эти, я вас уверяю, не так уж малы.
4 мар 05, 15:44    [1364325]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
kto-to
Member

Откуда: Ukraine, Kyev
Сообщений: 835
Dmitry Biryukov

...
6. удалить старые колонки с PK/FK
7. переименовать колонки с GUID в ID (это чтобы все ХП, вьюхи и приложение не развалилось)

Перед 6 не забудь про составные индексы
4 мар 05, 15:51    [1364367]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
lesha
Member

Откуда:
Сообщений: 157
я чего-то не понял, какие проблемы возникают при использовании диапазонов ID + GUID ?
5 мар 05, 13:27    [1366867]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
alex_sm
Member

Откуда: Смоленск
Сообщений: 303
Dmitry Biryukov
1. добавить по новой колонке GUID - это будущий PK, значение сгенерится автоматом
2. добавить для каждого FK по колонке ..._GUID.
3. заполнить значения внешних ключей с GUID'aми по имеющимся integer ключам
4. создать связи по новым колонкам с GUID
5. удалить связи по старым колонкам с identity int
6. удалить старые колонки с PK/FK
7. переименовать колонки с GUID в ID (это чтобы все ХП, вьюхи и приложение не развалилось)

я у себя в базе делал проще:
1. В связях проставил CASCADE UPDATE
2. поменял тип id с int на varchar(38)
3. UPDATE table SET id = NEWID()
4. поменял тип id с varchar(38) на uniqueidentifier
5 мар 05, 13:30    [1366882]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
2 alex_sm: GREAT !
только лучше не varchar(38), а char(36)
и второе: такой подход пройдёт если менять всё вручную в ЕМ, т.к. он сам генерит скрипт типа
CREATE TABLE dbo.Tmp_mytable
...
INSERT INTO dbo.Tmp_mytable
SELECT from mytable
EXEC sp_rename
плюс прочие примочки типа тригеров, связей, констрэйнотов

это лучше, чем руками, но хуже чем автоматом
5 мар 05, 13:36    [1366910]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
lesha
я чего-то не понял, какие проблемы возникают при использовании диапазонов ID + GUID ?
воспрос внимательнее прочитайте, пожалуйста.
идентити + GUID использовать никто не собирается
вопрос о переходе от идентити к ГУИДам с минимальной ручной работой
5 мар 05, 13:40    [1366928]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
alex_sm
Member

Откуда: Смоленск
Сообщений: 303
Dmitry Biryukov
2 alex_sm: GREAT !
только лучше не varchar(38), а char(36)
и второе: такой подход пройдёт если менять всё вручную в ЕМ, т.к. он сам генерит скрипт...

Я в ЕМ все и делал :)
5 мар 05, 13:44    [1366947]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
timda
Member

Откуда: Россия
Сообщений: 579
я репликацией занимался года три назад - поставил в офисе MSSQL и был MSSQL у провайдера, я ему говорю, как только что то в базе сменицца - фигачь изменения. Так вот в базе у меня не было ни одного ГУИДа - и все ходило по струнке.
Почему у меня тогда работало, а у вас нельзя ? Странно ... Вопрос ... ;-)


timda.ru
9 мар 05, 17:51    [1372706]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
ничего странного.
1. ключи были сурогатные или естественные?
2. были ли первичные ключи с identity(1,1) int?
3. в какой из баз добавлялись записи?
9 мар 05, 18:09    [1372782]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
timda
Member

Откуда: Россия
Сообщений: 579
> 1. ключи были сурогатные или естественные?
то точно не помню, но скорее всего были на справочники - сама по себе система была не очень сложной

> 2. были ли первичные ключи с identity(1,1) int?
ага с флажком репликации

3. в какой из баз добавлялись записи?
из локальной базы - данные добавлялись в интернет базу

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

Каким кстати образом лучше делать ? Может в таблицу вводить дополнительнительное поле ГУИДа ?
doc(doc_id PK, ..... , doc_guid )
и по нему репликацию настраивать
в случае пк гуидного веть умрет все или нет?

timda.ru
9 мар 05, 18:26    [1372825]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
timda
3. в какой из баз добавлялись записи?
из локальной базы - данные добавлялись в интернет базу

Всё понятно - ид генерировались только в одной базе. А вот если бы вы попробовали добавить по записи в каждой из баз - то увидели бы в чём проблема.
9 мар 05, 18:30    [1372834]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
timda
Member

Откуда: Россия
Сообщений: 579
Ну звините, может чото путаю, но разве нельзя так задать конфигурацию чтобы MSSQL сервер следил при репликации мгновенной тем более ... конечно если тама биллинговая система или система статистики - то да ;-)

timda.ru
9 мар 05, 18:33    [1372845]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
при мгновенной может быть и можно, но у меня слиянием
да и серверов не 2, а 40, некоторые длительное время могут быть вообще недоступны
9 мар 05, 18:39    [1372860]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Gary
Member

Откуда: Святая Земля
Сообщений: 110
Всем, пославшим диапазоны в лес - присоединяюсь.
Но, по поводу GUID, сомневаюсь - FK на varchare? мммм...
У меня репликация двух типов (transactional immediate/queued), настройка новых серверов динамическая. Для РК пользую сегментный ключ: ИД сервера плюс аутоинкремент (SCOPE_IDENTITY, ага-ага) из локальной таблицы, в которую пишу в той же транзакции (запись в базу только через процедуры)
Работает уже 5 лет без нареканий
9 мар 05, 18:39    [1372863]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Dmitry Biryukov
Member

Откуда: Женева
Сообщений: 1751
2 Gary: при чём тут varchar? PK и FК будут на гуидах.

автор
сегментный ключ: ИД сервера плюс аутоинкремент

тоже не хочется, ибо ИД сервера каждый раз прописывать где-то и как-то надо. а как это всё разгребать, если ошибится, плюс все вьюхи и ХП надо основательно проработать по поводу переделки связей с одного поля на два
9 мар 05, 18:44    [1372870]     Ответить | Цитировать Сообщить модератору
 Re: переход с ID (int identity) на GUID (uniqueidentifier)  [new]
Gary
Member

Откуда: Святая Земля
Сообщений: 110
А где хранить guid? char(36)!
varchar - описка
9 мар 05, 18:50    [1372882]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить