Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Решение здесь.

Обсуждаем.
6 окт 09, 22:45    [7750624]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
aleks2
Guest
Главный вопрос: нахрен ЭТО нужно?
7 окт 09, 06:31    [7751078]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
aleks2
Главный вопрос: нахрен ЭТО нужно?
А штоп как в оракле было!
7 окт 09, 06:54    [7751092]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Влом регистрироваться
Guest
aleks2,

например:
- обеспечить уникальность PK(ID) на уровне базы данных, а не таблицы.
- обеспечить сквозную нумерацию в рамках периода (года)
- при работе с master-detail удобно знать ID мастер-записи еще до отправки в БД, без промежуточных вызовов select scope_identity()

Не скажу, что без генераторов жить нельзя, но мне кажется, что такая фича бы MSSQL вовсе не помешала.
7 окт 09, 08:39    [7751213]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
DeColo®es
Обычно предлагаемые в решения по генерации "бизнес-номеров", написанные на TSQL и базирующиеся на таблицах с текущими значениями счетчиков, имеют один жутчайший недостаток - блокировки. Действительно, если мы "генерируем" новый номер, то на время генерации мы должны заблокировать счетчик, чтобы в другом соединении не было получено тоже значение. А как правило, номер нам нужно получать в рамках уже открытой транзакции, что чревато тем, что два изначально независимых бизнес-процесса будут в лучшем случае долго блокировать один другого, а в худшем - окажутся не настолько независимыми, чтобы избежать взаимоблокировки (deadlock).


Что-то я не понял (видимо не проснулся), а что помешает в приведенном решении получить "тоже значение" для стартового значения последовательности?!
7 окт 09, 08:56    [7751247]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
pkarklin
Что-то я не понял (видимо не проснулся), а что помешает в приведенном решении получить "тоже значение" для стартового значения последовательности?!
Range блокировка, если я уже проснулся и понял вопрос. ;)
7 окт 09, 09:36    [7751413]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
tpg
aleks2
Главный вопрос: нахрен ЭТО нужно?
А штоп как в оракле было!
В Оракле отстой какой-то этот сиквенс - не хочу, чтоб как в нем.

Мне нужны "внетранзакционные" генераторы для бизнес-задач, чтобы их значения людям показывать. Всякие там номерки документов. SEQUENCE для этого подходит, как дюймовый инструмент для метрических гаек.
7 окт 09, 09:39    [7751433]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
DeColo®es
Range блокировка, если я уже проснулся и понял вопрос. ;)


А где она "там"?! Носом ткнуть можете?
7 окт 09, 09:44    [7751457]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
pkarklin
А где она "там"?! Носом ткнуть можете?

Ну так:
            set @Value = CurrentValue = CurrentValue + 1
            from _Generator.Sequence s with(holdlock)
            where Name = @Sequence
7 окт 09, 09:59    [7751527]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
merle__
Guest
Да, "как убить себя гранатой" (с)
7 окт 09, 23:32    [7756120]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
aleks2
Главный вопрос: нахрен ЭТО нужно?
Вот почему надо так встречать любое пожелание? Вот так сразу с недосыпу "а нахрен". В MSSQL много возможностей - хороших и разных - хоть покер, хоть ... блэкджек. Обычный внетранзакционный счетчик - разве это помешало бы?
7 окт 09, 23:38    [7756137]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
DeColo®es
Решение здесь.

Обсуждаем.
Обсуждаем. Не создаст ли предложенная схема пресловутый bottleneck? Помнится мне, был один топик. Автор там тоже желал генераторов (сори найти так и не смог, много нафлудил, увы :(). Я там предлагал некое решение, но сразу сам же и решительно забыл. Потому что сам явственно видел картину гольных дедушек-локов...
7 окт 09, 23:43    [7756151]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
stas13
Guest
Хорошо, что подобный счетчик все-таки можно сделать.
Плохо, что гланды удаляем ректально.
8 окт 09, 00:37    [7756283]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
stas13
Guest
Ну то есть я хотел сказать, что гланды удаляем через .net
8 окт 09, 00:39    [7756290]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Senya_L
Не создаст ли предложенная схема пресловутый bottleneck?
Естественно, создаст. То есть может создать, если количество обращений к генератору превысит предельную скорость генерации.
Скорость работы (из того, что реально видел) в разных реализациях - от 1 до 5 тысяч значений в секунду на одном счетчике.
Для генерации номеров платежек и счетов-фактур вполне должно хватить. ;) А для случаев "массовой" загрузки в "полной" реализации есть доп. параметр - инкремент. То есть резервируем сколько нужно номеров одним обращением и далее плюсуем начальное значение к ROW_NUMBER().

Senya_L
сам явственно видел картину гольных дедушек-локов...
Если Вы о deadlock - тут им взяться просто неоткуда - к таблице со счетчиками обращаются всего 2 процедуры используя "правильный" алгоритм наложения блокировок и кроме этих обращений в транзакциях никаких блокровок больше быть не должно в принципе.
8 окт 09, 01:43    [7756382]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Senya_L
aleks2
Главный вопрос: нахрен ЭТО нужно?
Вот почему надо так встречать любое пожелание? Вот так сразу с недосыпу "а нахрен".
И я о том же - довелось программировать в трех отраслях народного хозяйства - медицина, производство, финансы. И везде требовалось генерить какие-нибудь номера (амбулаторная карта, история болезни, номер накладной, номер изделия, номер платежки, номер СФ). И везде одни и те же требования - "внетранзакционность" и "ну хоть как-то закрыть дырки". Оба требования можно реализовать кучей способов и без CLR. Но все эти эти реализации - как надевать штаны через голову.

Но не стоит огорчаться - по некоторым данным, есть шанс дождаться генераторов в следующей после SQL2008R2 версии.
8 окт 09, 01:54    [7756394]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
DeColo®es
Для генерации номеров платежек и счетов-фактур вполне должно хватить. ;)
Да, платежки не плодятся как кролики. Но вот проводки могут занимать достаточно длительное время. И по-правильному, если в одной транзакции. Пока та не закончится - все жаждущие "счетчика" будут курить в сторонке Или я чего-то недопонял?
8 окт 09, 02:01    [7756401]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Вопрос снимается. Я прочитал это
автор
А вот в CLR функции у нас есть возможность подключиться к тому же серверу и базе, но уже в другом соединении и вызвать процедуру, генерирующую интересующий нас номер, не накладывая длительных блокировок.
Не все сразу стало понятно, но в любом случае про такой workaround для автономных транзакций знать интересно. Но сразу скажу - непрерывной последовательности Вы так не получите. Увы.
8 окт 09, 02:09    [7756403]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Senya_L
Но сразу скажу - непрерывной последовательности Вы так не получите. Увы.
Нужна непрерывная последовательность? Так в чем проблема - добавьте параметр "инкремент"! ;)
И на выходе поступайте как угодно - можно получить первое, последнее число в этой "непрерывной" последовательности, а можно table-valued function сделать. На том же C#, например.
8 окт 09, 02:18    [7756408]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Senya_L
Пока та не закончится - все жаждущие "счетчика" будут курить в сторонке Или я чего-то недопонял?
Все будут ждать счетчика соответствующих проводок. Остальные счетчики не блокируются. Блокируется только имя последовательности, а не вся система генерации.
8 окт 09, 02:21    [7756412]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
DeColo®es
Блокируется только имя последовательности, а не вся система генерации.
Это я понял чуть позже вчитавшись в исходный тынц. Тут вопросов не имеется.

Идея интересная. Мне после Firebird генераторов не хватало Я мужественно молчал об этой нехватке, чтобы общественность мне не дала по шее. :) Мол, нет - и нефиг. А штука пользительная.

ЗЫ. Дело за малым - потестить под реальной нагрузкой. ;)

ЗЗЫ. А про непрерывность Вы кривите душой. Без блокировок основных транзакций там не обойтись, как ни крути.
8 окт 09, 02:33    [7756425]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
Senya_L
ЗЗЫ. А про непрерывность Вы кривите душой. Без блокировок основных транзакций там не обойтись, как ни крути.
При чем тут основные транзакции? Вы для основной транзакции резервируете сразу 100 значений и распределяете их как Вам угодно.

Остальные будут получать уже значения на 100 больше, вне зависимсти от того, успели Вы в своей транзакции их распределить или нет.

Можно, конечно функцию распределения предварительно зарезервированных значений и на CLR "возложить", но я бы не стал - принципиально это уже не улучшит ситуацию, а вот тормозов добавит, пожалуй. ;)
8 окт 09, 02:51    [7756429]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Влом регистрироваться

- обеспечить уникальность PK(ID) на уровне базы данных, а не таблицы.

ROWVERSION
Is a data type that exposes automatically generated, unique binary numbers within a database.

Фиксируем значение в отдельном binary(8) поле при добавлении записи и получаем уникальный монотонно возрастающий номер записи в пределах базы данных. На дыры в последовательности закрываем глаза :)

Влом регистрироваться

- обеспечить сквозную нумерацию в рамках периода (года)


Используем таблицы - генераторы. Номерки генерируем в самый последний момент перед завершением транзакции. И затем обновляем этими номерками добавленные данные. И блокировки общих таблиц - генераторов минимальные и CLR не нужен.

Влом регистрироваться

- при работе с master-detail удобно знать ID мастер-записи еще до отправки в БД, без
промежуточных вызовов select scope_identity()


UNIQUEIDENTIFIER
8 окт 09, 04:07    [7756452]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
aleks2
Guest
Влом регистрироваться
aleks2,

например:
- обеспечить уникальность PK(ID) на уровне базы данных, а не таблицы.
- обеспечить сквозную нумерацию в рамках периода (года)
- при работе с master-detail удобно знать ID мастер-записи еще до отправки в БД, без промежуточных вызовов select scope_identity()

Не скажу, что без генераторов жить нельзя, но мне кажется, что такая фича бы MSSQL вовсе не помешала.


Дык не надо путать божий дар с яичницей.

Все перечисленное можно и нужно реализовывать на Identity и NewID(). А всякие "номерки без дырок" для показа бухам - генерируются либо загодя, либо пост-фактум.
8 окт 09, 07:02    [7756521]     Ответить | Цитировать Сообщить модератору
 Re: Генераторы в MSSQL  [new]
Пятница_13_1
Guest
Создать таблицу-генератор типа:
create table sequence1 ( new_id bigint identity ) ;

В дальнейшем для получения нового значения :
declare @new_id bigint ;
...
insert into sequence1 default values ; set @new_id=scope_identity() ;
insert into нужная_таблица1 (первичный_ключ,....) values (@new_id,...) ;
...
insert into sequence1 default values ; set @new_id=scope_identity() ;
insert into нужная_таблица1 (первичный_ключ,....) values (@new_id,...) ;
...
insert into sequence1 default values ; set @new_id=scope_identity() ;
insert into нужная_таблица2 (первичный_ключ,....) values (@new_id,...) ;
...
8 окт 09, 07:09    [7756530]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить