powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Генерация уникальных значений
13 сообщений из 13, страница 1 из 1
Генерация уникальных значений
    #34726694
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо для нескольких клиентов генерировать уникальные целочисленные значения в пределах пяти суток. Раньше были рандомы, но при увиличении нагрузки стали появляться дубликаты. Т.к. все приложения пользуют одну БД решили сделять через спец. таблицу плюс ХП которая вызывает для нее GET_IDENTITY.
Сегодня после перегрузки сервера БД по питанию (UPS сдох) началась генерации с значений которые были сгенерированы некоторое время до этого. Я так понял, что это значения которые были сгенерированы после последнего checkpoint'a.
Вопрос заключается в том как избежать повторных генераций?
У меня есть идея, которая заключается в том что GET_IDENTITY не пишется в transaction log и если сгенерированное значение сохранять в таблице(делать INSERT + @@identity), то можно этого избежать. Но при этом неизбежно возникнут издержки.
Может у кого есть лучшие идеи?

Удачи.
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34726856
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сколько примерно записей за 5 суток генерится?
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34726888
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порядка 400-500 тыс.
Но для нас важными яалются порядка 40%, т.е. эти значения не должны повторятся.
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34727010
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteus пишет:
> Может у кого есть лучшие идеи?

СУБД -то какая ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34727020
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри.
ASA 9.0.2.3044
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34727723
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сори за кривизну и непроверенность на то, действительно ли уникальные значения генерируются...
просто с ходу, а вдруг ;)
Код: plaintext
select convert(integer, substr(replace(replace(replace(replace(replace(replace(replace(uuidtostr(newid()), '-', ''), 'a', ''), 'b', ''), 'c', ''), 'd', ''), 'e', ''), 'f', ''),  1 ,  9 ))
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34727848
Rubber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на мой взгляд - такие задачи лучше делать через свой счётчик
(1 таблица в базе)
тогда ты точно знаешь какое значение будет следующим, знаешь как он работает, можешь повлиять на процесс генерации.
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34727970
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteusВопрос заключается в том как избежать повторных генераций?А зачем их избегать?
Сгенировал новый ID, проверил его в базе, если есть такой уже - сгенерируй новый ID и проверь его. И сиди в цикле генерации Id и проверки до тех пор пока не сделаешь уникальный ID. Его и запишешь...
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34728085
Марсель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так не пойдет ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    ================(Build #2529  - Engineering Case #367252)================

  ...  

  Note that the use of an empty table having an autoincrement column, together 
  with get_identity(), may still have resulted in values being re-used if the 
  database was not shut down cleanly and values were allocated since the last 
  checkpoint. Depending on how the values were used, it may have been possible 
  to correct the starting value in a DatabaseStart event by calling sa_reset_identity() 
  with the next value to use. For example:
    declare maxval unsigned bigint;
    set maxval = (select max(othercol) from othertab);
    call sa_reset_identity('IDGenTab', 'DBA', maxval);
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34729007
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
авторА зачем их избегать?
Сгенировал новый ID, проверил его в базе, если есть такой уже - сгенерируй новый ID и проверь его. И сиди в цикле генерации Id и проверки до тех пор пока не сделаешь уникальный ID. Его и запишешь...
Я не сохраняю значения при генерации, а просто отдаю их клиентам. Далее клиент если делает определенные запросы - посылает это и это число. На практике один запрос может прийти несколько раз и это число используется для того чтобы проверить бал ли такой запрос ранее и выполнить его только один раз. Именно в этот момент и происходит сохранение этого числа в базе, но сохраняются примерно 40%.
Я думаю сделать как предложил Марсель , но не встовлять записи со сгенерированными значениями в таблицу, а обновлять одну запись новым значением. Вот только не возникнут ли DeadLock.


Удачи!
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34729437
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я сделал табличку с полями regid счетчик, a1 integer, t1 timestamp, ну и вызываю свою функцию, в которой определяю дату/время через tx=NOW(), вставляю это значение в таблицу, поле a1 integer по умолчанию = 1, затем select sum(a1) where t1<=tx и отдаю это значение. Ночью проверяю подключения, беру всю сумму, удаляю все значения, ставлю счетчик в 0 и вставляю сумму.
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34729864
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем сделал так
Код: plaintext
1.
2.
3.
4.
5.
function fn_GetID()
returns unsigned integer 
begin
  insert into DBA.genID("ID","GenTime")values(default,default);
  return @@identity;
end;
В genID - данные хранятся в течении суток.

Всем спасибо.
...
Рейтинг: 0 / 0
Генерация уникальных значений
    #34774394
Disillusioned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нет ограничений на тип уникального значения - можно использовать функцию NewID(). Она возвращает значение типа UNIQUEIDENTIFIER, которое можно, при желании, перевести в char(50).
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Генерация уникальных значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]