Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
1

Последовательный генератор уникальных значений

05.10.2012, 16:25. Показов 7822. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть таблицы с первичным ключом тип: int
Добавляя новые данные пользователь может:
- либо сам ввести ключ
- либо база сама должна его сгенерировать

Моя реализация:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[CreateId]
(
)
RETURNS int
AS
BEGIN
    DECLARE @Id int
    SET @Id = 0
    WHILE @Id < 2000000
    BEGIN
        IF NOT EXISTS(SELECT [Id] FROM [Diseases].[Disease] WHERE [Id] = @Id)
            BREAK
        ELSE
            SET @Id = @Id + 1
    END
 
    RETURN @Id
END
При росте таблицы растёт и время генерации, так при количестве записей около миллиона на генерацию данным способом требуется примерно 12 секунд.
Есть ли какие либо способы ускорить этот процесс?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2012, 16:25
Ответы с готовыми решениями:

MSSQL вставка уникальных значений
Добрый день, вопрос в следующем. есть в таблице три поля с ключами ( например,название дата и...

Запрос с выводом уникальных значений
Здравствуйте , мне нужно сделать запрос на вывод количество уникальных числовых значений с одного...

Нахождение уникальных значений из таблицы по нескольким условиям
Добрый день, задался вопросом о нахождение уникальных значений из таблицы по нескольким условиям. ...

Выборка из БД уникальных записей по нескольким столбцам и суммирование их значений
Здравствуйте! MS SQL Server 2014. Помогите составить запрос &quot;Номенклатурный перечень...

14
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
05.10.2012, 16:41 2
А чем Identity не устраивает?
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
05.10.2012, 16:42 3
А зачем вам позволять пользователю самому вводить ключ? И что будет если он введет ключ который уже используется? Создали бы IDENTITY поле и все дела. Инкрементировался бы он у вас автоматически и все дела.
0
34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
05.10.2012, 21:03  [ТС] 4
Долго объяснять, но суть в том, что в обычной ситуации ключ вводится автоматом (генерируется). Однако бывают случаи когда ключ должен быть указан явно. Так же в какой-то момент он может изменится. Может я конечно, что-то делаю не правильно, но с Identity такой вариант использования не проходит (ругается на явно указанные значения).
Если не трудно наставьте на путь истинный?)
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
05.10.2012, 21:33 5
То есть алгоритм будет такой:

Если ключ не указан, то выбираем максимальный ключ из существующих (это будет сделано по индексу мгновенно) и прибавляем к нему 1. Если максимального ключа нет (в таблице еще нет записей), то берем 0.

Если ключ указан, то ищем есть ли уже такой в таблице (опять же быстро, по индексу, но уже не мгновенно). Если такой ключ уже существует, то предварительно в старой записи меняем его на новый (который определяем по первому варианту). В новой записи используем заданный ключ.

И разумеется, никаких циклов.
1
1929 / 1164 / 423
Регистрация: 31.05.2012
Сообщений: 4,116
05.10.2012, 23:27 6
Если ключ не указан, то выбираем максимальный ключ из существующих (это будет сделано по индексу мгновенно) и прибавляем к нему 1
При многопользовательской работе это в общем случае не гарантирует правильность создания ключей. Я выбрал и до INSERT-а (даже если он идет вслед за моей выборкой) сосед успел выбрать тот же максимальный ключ.
1
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
06.10.2012, 09:08 7
Для этого как раз и существуют транзакции, уровни изоляции, блокировка таблиц и т.д.
0
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
06.10.2012, 10:29 8
Цитата Сообщение от Graf_Nosferatu Посмотреть сообщение
(ругается на явно указанные значения)
http://msdn.microsoft.com/en-u... 88059.aspx
1
34 / 41 / 5
Регистрация: 07.09.2011
Сообщений: 108
06.10.2012, 14:02  [ТС] 9
И ещё вопрос. Что будет когда значение поля с Identity примет максимально допустимое значение?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
06.10.2012, 16:46 10
Цитата Сообщение от canopen Посмотреть сообщение
Для этого как раз и существуют транзакции, уровни изоляции, блокировка таблиц и т.д.
Тут требуется монопольная блокировка на чтение до конца транзакции.
Значит все выстроятся в очередь перед этим бутылочным горлышком.
Плохо! Очень плохо!

Вот тут гляньте: Организация пользовательских счетчиков (генераторов) в Microsoft SQL Server

В MS SQL 2012 появилась CREATE SEQUENCE
Тоже не без недостатков подход, конечно...
1
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 2
12.10.2012, 20:01 11
Цитата Сообщение от iap Посмотреть сообщение
Тут требуется монопольная блокировка на чтение до конца транзакции.
Значит все выстроятся в очередь перед этим бутылочным горлышком.
Плохо! Очень плохо!
.
Это смотря в какой момент определять значение ключа. Вычислять и присваивать уникальный идентификатор надо уже после того как пользователь завел все необходимые данные и нажал кнопку "сохранить\ввести", т.е. никаких очередей связанных с действием человека.
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
12.10.2012, 20:15 12
Цитата Сообщение от Oila Посмотреть сообщение
Это смотря в какой момент определять значение ключа. Вычислять и присваивать уникальный идентификатор надо уже после того как пользователь завел все необходимые данные и нажал кнопку "сохранить\ввести", т.е. никаких очередей связанных с действием человека.
Представьте, что эту же кнопку в этот же момент нажали ещё 100 человек
0
0 / 0 / 0
Регистрация: 12.10.2012
Сообщений: 2
15.10.2012, 14:08 13
Цитата Сообщение от iap Посмотреть сообщение
Представьте, что эту же кнопку в этот же момент нажали ещё 100 человек
А кто еще может нажать эту кнопку если запись новая(!), т.е. только предполагается к вводу данным пользователем и ни для кого другого её просто нет?!
Если же производится корректировка записи, например, как сформулировано в условиях примера заглавного поста, для ручного ввода уникального идентификатора, то блокировать запись на изменение(но не на чтение) кем-либо другим - норма и здесь проверки на корректность введенного вручную уникального идентификатора и его в апдейт в записи также требуют минимального времени определяемого только быстродействием системы (не раздумьями оператора) ибо только на этот краткий момент будет ставится полная локировка.
Обе ситуации при этом не мешают кому-либо иному в то же время добавлять как новые записи, так и редактировать старые.
0
1929 / 1164 / 423
Регистрация: 31.05.2012
Сообщений: 4,116
15.10.2012, 14:49 14
А кто еще может нажать эту кнопку если запись новая(!)
Еще 100 других пользователей, которые в этот момент добавляют каждый по записи. Такой способ генерации ключа используется, только получше будет формировать не по максимуму, а держать в другой таблице его значение. А вообщето лучше автоинкримента варианта не придумали, другое дело, что зачастую весьма не удобно
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
15.10.2012, 18:27 15
Цитата Сообщение от Аватар Посмотреть сообщение
только получше будет формировать не по максимуму, а держать в другой таблице его значение.
Какая разница?
0
15.10.2012, 18:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2012, 18:27
Помогаю со студенческими работами здесь

Генератор 25 уникальных чисел
Добрый вечер! Программа тестирования и нужно генерировать 25 уникальных номеров вопросов из скажем...

Генератор уникальных идентификаторов
Здравствуйте. Вопрос такой. Я пишу программу, которая позволит собирать приложения из xslt и xml...

Генератор уникальных чисел c++
Подскажите, мне нужно заполнить массив 4х4 уникальными числами от 0 до 15. Но компилятор зависает и...

Генератор уникальных комбинаций
В общем появилась задача сделать програмку в которой из группы строк(слов/словосочетаний) нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru