Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: приращение identity со случайным шагом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Dr. Blez
Вы не поняли. Устройства не определяют кол-во записей. Человек, который работает с этим устройством может определить кол-во записей, которые были добавлены на сервер всеми устройствами за период времени, имея два номера id. И может эту информацию использовать, не то, что бы во вред, но мне не хотелось бы, что бы эта информация была так просто доступна.
А, например,
SELECT COUNT(*) FROM ... WHERE ...
не даёт возможность посчитать количество записей, ничего не зная о существовании какого-то там id?
15 дек 09, 15:30    [8069768]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Мда

select cast(cast(newid() as varbinary) as bigint)
15 дек 09, 15:32    [8069793]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
iap
Dr. Blez
Вы не поняли. Устройства не определяют кол-во записей. Человек, который работает с этим устройством может определить кол-во записей, которые были добавлены на сервер всеми устройствами за период времени, имея два номера id. И может эту информацию использовать, не то, что бы во вред, но мне не хотелось бы, что бы эта информация была так просто доступна.
А, например,
SELECT COUNT(*) FROM ... WHERE ...
не даёт возможность посчитать количество записей, ничего не зная о существовании какого-то там id?


Устройства не имеют возможности выполнить такой запрос.
15 дек 09, 15:32    [8069795]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)
Нужно возрастающее значение, так что вместо newid() не лучше ли NEWSEQUENTIALID()?
15 дек 09, 15:39    [8069843]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)
Нужно возрастающее значение, так что вместо newid() не лучше ли NEWSEQUENTIALID()?

Разве возрастающее ?
15 дек 09, 15:40    [8069854]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
iap
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)
Нужно возрастающее значение, так что вместо newid() не лучше ли NEWSEQUENTIALID()?

Разве возрастающее ?
NEWSEQUENTIALID()
Создает идентификатор GUID, имеющий значение, большее любого идентификатора GUID, который был прежде создан на указанном компьютере при помощи этой функции.
Или вопрос не об этом?
Или я чего-то неправильно понимаю?
15 дек 09, 15:43    [8069889]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
iap
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)
Нужно возрастающее значение, так что вместо newid() не лучше ли NEWSEQUENTIALID()?

Разве возрастающее ?
NEWSEQUENTIALID()
Создает идентификатор GUID, имеющий значение, большее любого идентификатора GUID, который был прежде создан на указанном компьютере при помощи этой функции.
Или вопрос не об этом?
Или я чего-то неправильно понимаю?

По монотонновозрастающему значению какой-то клиент как-то там высчтиывает число записей. А это как раз вроде и не нужно
15 дек 09, 15:45    [8069907]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)


Это гарантирует уникальность полученного значения в сравнении с identity?
15 дек 09, 15:50    [8069956]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Glory
По монотонновозрастающему значению какой-то клиент как-то там высчтиывает число записей. А это как раз вроде и не нужно
Dr. Blez
Нужна возрастающая последовательность id, со случайным приращением
15 дек 09, 15:52    [8069976]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
Dr. Blez
Есть много устройств. Они обращаются к серверу. Помещают туда данные. А в ответ сервер им выдает id. Т.е. если я обращусь с устройства, потом, на следующий день, обращусь опять с устройства, посмотрю выданные номера записей, и определю, таким образом, сколько записей было добавлено на сервер за день. Мне необходимо всех запутать.
Мне необходимо решение, которое бы выдавало номер записей, для их последующей идентификации. Они не должны повторяться, и, ввиду того, что записей добавляется много (до 4000 в минуту), не хочется генерировать случайное число и проверять его по индексу, а хочется использовать какойто более простой механизм, который, во-первых, обеспечит некоторую случайность, а, во-вторых, приемлемую скорость.
...
Нужна возрастающая последовательность id, со случайным приращением...

Можете мудрить с datetime, беря текущее время
15 дек 09, 15:52    [8069979]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Dr. Blez
Glory
Мда

select cast(cast(newid() as varbinary) as bigint)


Это гарантирует уникальность полученного значения в сравнении с identity?

identity вообще то тоже не гарантирует уникальности
Уникальность гарантиует только уникальное ограничение
15 дек 09, 15:52    [8069980]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
любое приведение newid к binary(8) уникальности, конечно не даст.
А вот инкрементная часть newsequentialid - дает, поскольку функция используется в рамках windows машины, а не только одной базы.
Но и там с уникальностью могут быть проблемы, если базу перенести на другой сервер или переустановить Windows
15 дек 09, 15:55    [8070009]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Dr. Blez
Стоит задача
Хм. мой опыт подсказывает, что такие "задачи" возникают в голове начальника/аналитика/разработчика исключительно по собственной хитрости из разряда "а вот какой я умный, какую клевую безопасноть накрутил".

При этом приложение работает с правами sa, пароль зашит в клиента, данные "шифруются" по XOR с зашитой в то же приложение последовательностью, а коннект идет через SQL авторизацию.
15 дек 09, 16:01    [8070074]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
DeColo®es
любое приведение newid к binary(8) уникальности, конечно не даст.
А вот инкрементная часть newsequentialid - дает, поскольку функция используется в рамках windows машины, а не только одной базы.
Но и там с уникальностью могут быть проблемы, если базу перенести на другой сервер или переустановить Windows


Вот и я о том же. Я думал о таком. Посмотрел на GUID.

typedefstruct _GUID {
unsignedlong Data1;
unsignedshort Data2;
unsignedshort Data3;
unsignedchar Data4[8];
} GUID;

согласно RFC4122

Uuid->Data4[0] = (Uuid->Data4[0] & 0x3F) | 0x80;

Что еще снижает кол-во вариантов. :) Не сильно, конечно, но тем не менее

Наверно, есть только вариант создания таблицы и одним полем identity. Потом, перед вставкой в основную таблицу добалять записи в ту, что с одни полем, получать из нее SCOPE_IDENTITY() и его использовать при добавлении в основную таблицы. И периодически чистить записи в таблице с одим полем.
Блин, почему бы не сделать генераторы или последовательности?
15 дек 09, 16:04    [8070111]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
DeColo®es
Dr. Blez
Стоит задача
Хм. мой опыт подсказывает, что такие "задачи" возникают в голове начальника/аналитика/разработчика исключительно по собственной хитрости из разряда "а вот какой я умный, какую клевую безопасноть накрутил".

При этом приложение работает с правами sa, пароль зашит в клиента, данные "шифруются" по XOR с зашитой в то же приложение последовательностью, а коннект идет через SQL авторизацию.


Я бы с удовольствием переделал все клиентские устройства, на то, что бы они получали GUID, или даже хэш SHA1 над данными, но есть разработанные не нами, и там это будет сложно, может даже не возможно.

Кроме хитрожопости начальника/аналитика/разработчика есть еще вопрос обратной совместимости.
15 дек 09, 16:11    [8070167]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Я к тому, что если придти к инициатору такого требования и сказать, что:
для "обеспечения" требуется неделя работы, причем на выходе будет либо тормознутая система, либо с определенной вероятностью можно все-таки определить количество записей,
то сам инициатор скажет "А ну его - пусть будет возможность определения. Это я на всякий случай придумал."
15 дек 09, 16:23    [8070262]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
Dr. Blez
...Кроме хитрожопости начальника/аналитика/разработчика есть еще вопрос обратной совместимости.
Неужели обратная совместимость требует обязательного возрастания идентификаторов?! как ни крути - монотонность ни к чему, если не используется клиентами, а вы их все-равно "запутать" хотите
15 дек 09, 16:25    [8070284]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
DeColo®es
Я к тому, что если придти к инициатору такого требования и сказать, что:
для "обеспечения" требуется неделя работы, причем на выходе будет либо тормознутая система, либо с определенной вероятностью можно все-таки определить количество записей,
то сам инициатор скажет "А ну его - пусть будет возможность определения. Это я на всякий случай придумал."
+$10000
15 дек 09, 16:26    [8070296]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
vino
Dr. Blez
...Кроме хитрожопости начальника/аналитика/разработчика есть еще вопрос обратной совместимости.
Неужели обратная совместимость требует обязательного возрастания идентификаторов?! как ни крути - монотонность ни к чему, если не используется клиентами, а вы их все-равно "запутать" хотите


Ок. Долой монотонность.

Что дешевле с точки зрения БД? Проверять уникальность и повторять вставку при обломе, до тех пор, пока не вставится. Или добавить пяток-десяток записей в табличку с одним полем и использовать полученный SCOPE_IDENTITY. Количество добавляемых записей до 4000 в минуту.
15 дек 09, 16:33    [8070358]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
Dr. Blez, думаю, при генерации guid (при взятии самой изменяемой части) количество коллизий будет минимально. Но нужно проверить, принимает ли клиент
Dr. Blez
...клиент хочет int64...
действительно 64 бита, или, как иногда бывает, только 63 битное натуральное число
15 дек 09, 19:10    [8071535]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
vino
Dr. Blez, думаю, при генерации guid (при взятии самой изменяемой части) количество коллизий будет минимально. Но нужно проверить, принимает ли клиент
Dr. Blez
...клиент хочет int64...
действительно 64 бита, или, как иногда бывает, только 63 битное натуральное число


Это принципиально? 63 бита тоже устроит. На клиенте, по протоколу, принимается int64. На наших клиентах используется переменные Int64, на некоторых не наших, которые я видел, тоже Int64.

Под Int64 подразумевается целое со знаком. Т.е. аналог bigint в MSSQL
15 дек 09, 20:06    [8071651]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
Dr. Blez
vino
...63 битное натуральное число


Это принципиально? 63 бита тоже устроит. На клиенте, по протоколу, принимается int64. На наших клиентах используется переменные Int64, на некоторых не наших, которые я видел, тоже Int64.

Под Int64 подразумевается целое со знаком. Т.е. аналог bigint в MSSQL
Т.е. вы уверены, что код -1 и -9223372036854775808 будут восприняты клиентами без проблем?
Тогда рецепт Glory вполне подойдет
select cast(cast(newid() as varbinary) as bigint)
правда, лучше первичный ключ оставить IDENTITY, а код хранить в дополнительном поле с уникальным индексом, а на случай коллизии советую вставку строк реализовать повтором после возможного исключения вставки.
16 дек 09, 10:44    [8073221]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
Dr. Blez
vino
Dr. Blez, думаю, при генерации guid (при взятии самой изменяемой части) количество коллизий будет минимально. Но нужно проверить, принимает ли клиент
Dr. Blez
...клиент хочет int64...
действительно 64 бита, или, как иногда бывает, только 63 битное натуральное число


Это принципиально? 63 бита тоже устроит. На клиенте, по протоколу, принимается int64. На наших клиентах используется переменные Int64, на некоторых не наших, которые я видел, тоже Int64.

Под Int64 подразумевается целое со знаком. Т.е. аналог bigint в MSSQL
А почему бы просто время не конвертить???

Если чаще чем раз в 100 нс не будете вставлять, то и получаются псевдослучайно возрастающие целые числа.

select convert(bigint, right(replace(replace(replace(replace(convert(varchar, SYSDATETIME(), 121), '-', ''), ' ', ''), ':', ''), '.', ''), 19))
16 дек 09, 11:12    [8073494]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
Dr. Blez
Member

Откуда:
Сообщений: 135
vino
Тогда рецепт Glory вполне подойдет
select cast(cast(newid() as varbinary) as bigint)
правда, лучше первичный ключ оставить IDENTITY, а код хранить в дополнительном поле с уникальным индексом, а на случай коллизии советую вставку строк реализовать повтором после возможного исключения вставки.


Возможно я так и сделаю. Протестирую, миллионах на 50 вставок частоту возникновения дупов.
16 дек 09, 12:17    [8074343]     Ответить | Цитировать Сообщить модератору
 Re: приращение identity со случайным шагом  [new]
vino
Member

Откуда:
Сообщений: 1191
Dr. Blez
...Протестирую, миллионах на 50 вставок частоту возникновения дупов.

Тест вряд ли покажет проблему, так как вероятность коллизии слишком низка, но ваш алгоритм вставки должен учесть такое исключение и повести себя правильно, чтобы не потерять данные.
Хотя, если все Ваши клиенты готовы к возникновению ошибки при вставке, то можно не заморачиваться, так как клиентское ПО само повторит операцию
16 дек 09, 12:53    [8074694]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить