Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Добрый день.

Есть требование организовать нарастающую последовательность чисел без пробелов.
По сути это модуль заданий, мини Mantis что-то в этом духе, и ожидают собственного выше описаного назначения нумеров заданий.
Я не вижу большой нужды в этом, но пока еще не удалось перубедить.
23 апр 16, 20:12    [19098061]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
Glory
Member

Откуда:
Сообщений: 104760
И в чем проблема ?
23 апр 16, 20:14    [19098069]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

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

Если использовать сиквенс то откаты транзакции "рвут" последовательность.
Можно еще собственные таблицы завести. Но такой подход пока не рассматривал.
23 апр 16, 20:36    [19098103]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
Glory
Member

Откуда:
Сообщений: 104760
mezzanine
Если использовать сиквенс то откаты транзакции "рвут" последовательность.

А еще удаления записей тоже это сделают

Проблема то у вас какая ?
23 апр 16, 20:39    [19098107]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

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

С удалениями пусть будут. Много пользователей создают заявки и у них красивые номера от 1 до 100, ну и потом растет.
23 апр 16, 20:50    [19098142]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

Откуда:
Сообщений: 157
mezzanine,

И еще выжный момент. Нумерация в пределах подпроекта, которые создаются пользователем в любом количестве.
23 апр 16, 20:52    [19098150]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
mezzanine
Glory,

С удалениями пусть будут. Много пользователей создают заявки и у них красивые номера от 1 до 100, ну и потом растет.
Принципиально красивая последовательная нумерация возможна в единственном варианте - блокировать всех пользователей до конца транзакции. По другому никак не придумать.
Именно поэтому это не реализовано в MSSQL "из коробки", из за дикой деградации производительности.

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

mezzanine
И еще выжный момент. Нумерация в пределах подпроекта, которые создаются пользователем в любом количестве.
Вот это уже проще, просто рассчитывайте нумерацию в пределах "подпроекта", какие собственно проблемы?
23 апр 16, 20:59    [19098169]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

Откуда:
Сообщений: 157
alexeyvg,

Таблица с заданиями одна. В ней среди многих полей есть номер задания и тип проекта.
Если идти путем секвенций то нужно под каждый подпроект создавать динамически последовательность. Скорей всего маленькая табличка с ID подпроекта и именем сиквенции.
Если в таблице искать MAX+1 в рамках подпроекта то нужно блокировать таблицу. Потомучто есть вероятность получения у 2-х и более пользователей одинакового номера и кто-то по просту не сможет записать задание т.к. есть уникальность.
23 апр 16, 21:33    [19098233]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
mezzanine
Если идти путем секвенций то нужно под каждый подпроект создавать динамически последовательность. Скорей всего маленькая табличка с ID подпроекта и именем сиквенции.
1. Сиквенс один.
2. В служебной таблице ID подпроекта и базовый номер, который взят из сиквенса при создании подпроекта
3. Делаете представление для показа пользователям номеров в "красивом" (номер - базовый из служебной таблички) виде.
23 апр 16, 22:37    [19098307]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
Что-то я вчера погорячился насчет одного сиквенса...

Вообще, задача генерации "непрерывной" последовательности решается с помощью служебной таблицы и без необходимости блокировки основной таблицы.
Примерно так:
+
use tempdb;
go

create table dbo.g (g int primary key, v int);
create table dbo.t (id int identity primary key, g int, g_sec int, s varchar(100));
go

create trigger dbo.tr_t
on dbo.t
instead of insert
as
begin
 set nocount on;

 declare @g table (g int primary key, base int);

 merge into dbo.g with (serializable) t
 using (select g, count(*) from inserted group by g) s(g, c) on s.g = t.g
 when not matched then
  insert (g, v) values (s.g, s.c)
 when matched then
  update set v += s.c
 output
  inserted.g, isnull(deleted.v, 0) into @g(g, base);

 insert into dbo.t
  (g, g_sec, s)
  select
   i.g, g.base + row_number() over (partition by i.g order by (select 1)), i.s
  from
   inserted i join
   @g g on g.g = i.g;
end;
go

insert into dbo.t
values
 (1, null, 'a'), (1, null, 'a'), (1, null, 'a'),
 (2, null, 'b'), (2, null, 'b');

insert into dbo.t
values
 (1, null, 'b'), (1, null, 'b'), (1, null, 'b'), (1, null, 'b'),
 (2, null, 'c'), (2, null, 'c'), (2, null, 'c');

select * from dbo.t;
go

drop table dbo.t, dbo.g;
go
24 апр 16, 11:30    [19098808]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Генераторы в MSSQL
24 апр 16, 14:32    [19099274]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
mezzanine
Member

Откуда:
Сообщений: 157
iap,

Генератор как бы и есть секвенция. Попробую реализовать вариант invm. Всем спасибо за помощь!
24 апр 16, 21:01    [19100180]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
mezzanine
iap,

Генератор как бы и есть секвенция. Попробую реализовать вариант invm. Всем спасибо за помощь!
Ссылка была не на сиквенс MSSQL, а на самостоятельную реализацию, очень гибкую и эффективную.

Но вам может б
mezzanine
Если в таблице искать MAX+1 в рамках подпроекта то нужно блокировать таблицу. Потомучто есть вероятность получения у 2-х и более пользователей одинакового номера и кто-то по просту не сможет записать задание т.к. есть уникальность.
Но можно блокировать и диапазон ключа, ведь вам же достаточно блокировки только для одного номера подпроекта. Как я понимаю, это будет делаться само, при правильном индексе и уровне изоляции.
24 апр 16, 22:52    [19100614]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
makar182
Member

Откуда:
Сообщений: 36
alexeyvg
Вы сами можете сделать такое, просто заблокировав таблицу, и рассчитав следующий номер.


А как заблокировать таблицу, подскажите пожалуйста?
15 май 16, 10:52    [19175024]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
Rankatan
Member

Откуда:
Сообщений: 250
makar182
alexeyvg
Вы сами можете сделать такое, просто заблокировав таблицу, и рассчитав следующий номер.


А как заблокировать таблицу, подскажите пожалуйста?

WITH(TABLOCKX)
15 май 16, 13:19    [19175324]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающая последовательность чисел без пробелов  [new]
makar182
Member

Откуда:
Сообщений: 36
Rankatan
makar182
пропущено...


А как заблокировать таблицу, подскажите пожалуйста?

WITH(TABLOCKX)


Подскажите, пожалуйста, как правильно воспользоваться WITH(TABLOCKX) в следующей ситуации:

В таблицу №1 одновременно может происходит несколько вставок от разных пользователей и необходимо, чтобы при каждой вставке выполнялись операции в следующем порядке:
1. Блокировка таблицы №1 для других пользователей, кроме текущего пользователя;
2. Вставка в таблицу №1 записи от текущего пользователя;
3. Считывание количества записей в таблице №1 и добавление к полученному значению единицы;
4. Запись полученного в п.3 значения в таблицу №2;
5. Разблокировка таблицы №1 для дальней вставки в нее уже других записей от других пользователей.
15 май 16, 15:40    [19175622]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить