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

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

СУБД -то какая ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.08.2007, 15:40
    #34727020
moteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
Сорри.
ASA 9.0.2.3044
...
Рейтинг: 0 / 0
14.08.2007, 18:56
    #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
14.08.2007, 20:52
    #34727848
Rubber
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
на мой взгляд - такие задачи лучше делать через свой счётчик
(1 таблица в базе)
тогда ты точно знаешь какое значение будет следующим, знаешь как он работает, можешь повлиять на процесс генерации.
...
Рейтинг: 0 / 0
14.08.2007, 23:06
    #34727970
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
moteusВопрос заключается в том как избежать повторных генераций?А зачем их избегать?
Сгенировал новый ID, проверил его в базе, если есть такой уже - сгенерируй новый ID и проверь его. И сиди в цикле генерации Id и проверки до тех пор пока не сделаешь уникальный ID. Его и запишешь...
...
Рейтинг: 0 / 0
15.08.2007, 02:33
    #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
15.08.2007, 12:32
    #34729007
moteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
White Owl
авторА зачем их избегать?
Сгенировал новый ID, проверил его в базе, если есть такой уже - сгенерируй новый ID и проверь его. И сиди в цикле генерации Id и проверки до тех пор пока не сделаешь уникальный ID. Его и запишешь...
Я не сохраняю значения при генерации, а просто отдаю их клиентам. Далее клиент если делает определенные запросы - посылает это и это число. На практике один запрос может прийти несколько раз и это число используется для того чтобы проверить бал ли такой запрос ранее и выполнить его только один раз. Именно в этот момент и происходит сохранение этого числа в базе, но сохраняются примерно 40%.
Я думаю сделать как предложил Марсель , но не встовлять записи со сгенерированными значениями в таблицу, а обновлять одну запись новым значением. Вот только не возникнут ли DeadLock.


Удачи!
...
Рейтинг: 0 / 0
15.08.2007, 14:02
    #34729437
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
А я сделал табличку с полями regid счетчик, a1 integer, t1 timestamp, ну и вызываю свою функцию, в которой определяю дату/время через tx=NOW(), вставляю это значение в таблицу, поле a1 integer по умолчанию = 1, затем select sum(a1) where t1<=tx и отдаю это значение. Ночью проверяю подключения, беру всю сумму, удаляю все значения, ставлю счетчик в 0 и вставляю сумму.
...
Рейтинг: 0 / 0
15.08.2007, 15:42
    #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
04.09.2007, 13:44
    #34774394
Disillusioned
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация уникальных значений
Если нет ограничений на тип уникального значения - можно использовать функцию NewID(). Она возвращает значение типа UNIQUEIDENTIFIER, которое можно, при желании, перевести в char(50).
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Генерация уникальных значений / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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