Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Массовое использование SEQUENCE. Как лучше?  [new]
Oleg Krivopusk
Member

Откуда: Хабаровск
Сообщений: 50
Здравствуйте!

Создаем новый проект (ДБ). Есть желание в КАЖДОЙ таблице иметь обязательные поля
 Id int, HId int 

Нужно, чтобы при добавлении новой строки в таблицу эти поля получали одно и то же значение.
Можно конечно Id сделать автоинкриментным, а тригером обновлять HID. Но вроде есть отличное решение SEQUENCE.
Все отлично работает.
И чтобы не наткнуться впоследствии на грабли спрошу Вас, уважаемые профессора и академики.

1. Если на каждую таблицу создавать свой SEQUENCE, то не будет ли это "перебор" ? Или может сделать поля типа BigInt и один (ну или немножко) SEQUENCE на все таблицы?
2. Как избежать ситуации, когда "по неосторожности" кто то процедурой sp_sequence_get_range за раз дойдет до предела максимального значения или будет резервировать огромные диапазоны?

Буду рад услышать Ваш опыт использования.
Спасибо.
20 мар 15, 04:58    [17407885]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Oleg Krivopusk
1. Если на каждую таблицу создавать свой SEQUENCE, то не будет ли это "перебор" ?

А создание триггера на каждую таблицу тоже будет перебором ?
Нет никакого числового ограничения на число объектов в базе

Oleg Krivopusk
2. Как избежать ситуации, когда "по неосторожности" кто то процедурой sp_sequence_get_range за раз дойдет до предела максимального значения или будет резервировать огромные диапазоны?

Нельзя по неосторожности что-то выполнить, если на выполнения этого что-то у тебя не будет прав

Сообщение было отредактировано: 20 мар 15, 09:20
20 мар 15, 09:20    [17408225]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Oleg Krivopusk
1. Если на каждую таблицу создавать свой SEQUENCE, то не будет ли это "перебор" ? Или может сделать поля типа BigInt и один (ну или немножко) SEQUENCE на все таблицы?


В Oracle так всегда делали.


Oleg Krivopusk
2. Как избежать ситуации, когда "по неосторожности" кто то процедурой sp_sequence_get_range за раз дойдет до предела максимального значения или будет резервировать огромные диапазоны?


Нужно задать необходимый предел. INDENTITY RESEED тоже можно переполнить, если делать не то, что надо. А такого кого-то не надо до БД допускать. Вопрос, а зачем вам SEQUENCE -- чем IDENTITY не устраивает?
20 мар 15, 12:12    [17409225]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Oleg Krivopusk, вас посещают странные идеи с хранением лишней информации, однако, Вы чего-то там нафантазировали с триггерами и сиквенсами:
create table tempdb.dbo.t1 (f1 int identity(1,1), f2 int default (ident_current('tempdb.dbo.t1')), f3 char)
insert tempdb.dbo.t1 (f3) values ('a')
insert tempdb.dbo.t1 (f3) values ('b')
insert tempdb.dbo.t1 (f3) values ('c')
select * from tempdb.dbo.t1
drop table tempdb.dbo.t1
20 мар 15, 13:31    [17409670]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Владислав Колосов,

запустите свое чудо в 4-5 потоках. узнаете много интересного.
у меня 260 416 "кривых" записей (f1 <> f2) для 1 284 553 добавленных
20 мар 15, 13:39    [17409720]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 Oleg Krivopusk

делаем +2 поля. одно - для хранения. NULL. второе - вычисляемое, PERSISTED, для вычиток. через ISNULL, конечно же
пока явно другое значение не прописали - значения одинаковые с Id. после того, как прописали "свое" - разные
если же вам НЕ нужны разные значения - зачем вам разные поля?
20 мар 15, 13:42    [17409739]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Crimean
2 Oleg Krivopusk

делаем +2 поля. одно - для хранения. NULL. второе - вычисляемое, PERSISTED, для вычиток. через ISNULL, конечно же
пока явно другое значение не прописали - значения одинаковые с Id. после того, как прописали "свое" - разные
если же вам НЕ нужны разные значения - зачем вам разные поля?


Речь шла о том, чтобы они при вставке получали одно значение, а что потом не оговаривалось.
20 мар 15, 13:47    [17409777]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
a_voronin
Речь шла о том, чтобы они при вставке получали одно значение, а что потом не оговаривалось.


ну наличие двух разных полей говорит о том, что они могут хранить разные значения, ага?
иначе ( f1 int, f2 as f1 persisted ) и все :)
20 мар 15, 13:51    [17409797]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
может ТС про другое? вечная проблема бухгалтерии - сквозная нумерация в разрезе отчётного периода?
20 мар 15, 13:52    [17409806]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Konst_One
может ТС про другое? вечная проблема бухгалтерии - сквозная нумерация в разрезе отчётного периода?


все "гаранты" уникальности делают "дырки". сиквенсы - не исключение.
20 мар 15, 13:58    [17409851]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Чего страдать? Триггер - отличное решение.
CREATE TABLE T(ID INT NOT NULL IDENTITY, HId INT NULL);
GO
CREATE TRIGGER InsertT ON T FOR INSERT AS UPDATE T SET T.Hid=T.ID FROM inserted i WHERE T.ID=i.ID;
GO
Шаблон на создание и таблицы и триггера сделать, и не мучиться.
20 мар 15, 14:00    [17409866]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Crimean
Konst_One
может ТС про другое? вечная проблема бухгалтерии - сквозная нумерация в разрезе отчётного периода?


все "гаранты" уникальности делают "дырки". сиквенсы - не исключение.

Ну так вот ТС одно поле оставит как ПК, а второе будет менять для получения сквозной нумерации
А изначально "при добавлении новой строки в таблицу эти поля получали одно и то же значение."
20 мар 15, 14:00    [17409868]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Crimean
Владислав Колосов,

запустите свое чудо в 4-5 потоках. узнаете много интересного.
у меня 260 416 "кривых" записей (f1 <> f2) для 1 284 553 добавленных


Ваша правда, не гарантирует.
20 мар 15, 14:02    [17409884]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Glory
Crimean
пропущено...


все "гаранты" уникальности делают "дырки". сиквенсы - не исключение.

Ну так вот ТС одно поле оставит как ПК, а второе будет менять для получения сквозной нумерации
А изначально "при добавлении новой строки в таблицу эти поля получали одно и то же значение."
Не логичнее ли не изворачиваться, присваивая значение одного поля другому,
а оставить второе поле NULLом, пока реальный номер не рассчитается?
20 мар 15, 14:10    [17409920]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
пропущено...

Ну так вот ТС одно поле оставит как ПК, а второе будет менять для получения сквозной нумерации
А изначально "при добавлении новой строки в таблицу эти поля получали одно и то же значение."
Не логичнее ли не изворачиваться, присваивая значение одного поля другому,
а оставить второе поле NULLом, пока реальный номер не рассчитается?

Вряд ли возможно при наличии ограничения уникальности на этом поле поставить нескольким записям NULL
А без ограничения уникальности на этом поле проблем будет еще больше. Имхо
Потому что верояно, что в качестве "рассчитывателя номера" будет выступать человек, а не программный код.

Сообщение было отредактировано: 20 мар 15, 14:14
20 мар 15, 14:13    [17409932]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Glory
Вряд ли возможно при наличии ограничения уникальности на этом поле поставить нескольким записям NULL
Вы же знаете, что это возможно, начиная с SQL2008.
CREATE UNIQUE INDEX iHId ON T(HId) WHERE HId IS NOT NULL;
20 мар 15, 14:20    [17409965]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Crimean
запустите свое чудо в 4-5 потоках
Зачем так сложно? :) Достаточно
insert tempdb.dbo.t1 (f3) values ('d'), ('e'), ('f');
20 мар 15, 15:42    [17410530]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Похоже, что дефолт работает вне рамок транзакционности.
20 мар 15, 15:48    [17410573]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Владислав Колосов
Похоже, что дефолт работает вне рамок транзакционности.


омг... не в дефолте дело...
20 мар 15, 16:29    [17410875]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Тогда интересно, почему вставки не выстраиваются в очередь.
По идее так:

процесс 1 получил блокировку U страницы
процесс 2 ждет блокировку U страницы
процесс 1 получил identity
процесс 1 получил default
процесс 1 вставил запись
процесс 1 снял блокировку U страницы
процесс 2 получил блокировку U страницы

Вероятно, процесс 2 не ждет блокировку в случае, если он начинает вставку на новую страницу?
20 мар 15, 16:52    [17411053]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
## do diezz ##
Guest
Владислав Колосов
Тогда интересно, почему вставки не выстраиваются в очередь.
По идее так:

процесс 1 получил блокировку U страницы
процесс 2 ждет блокировку U страницы
процесс 1 получил identity
процесс 1 получил default
процесс 1 вставил запись
процесс 1 снял блокировку U страницы
процесс 2 получил блокировку U страницы

Вероятно, процесс 2 не ждет блокировку в случае, если он начинает вставку на новую страницу?


процессы не причем. по моему, дело в том, что недетерминирован порядок вычисления колонок. потому будет каша.
20 мар 15, 16:57    [17411093]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Владислав Колосов
...
процесс 1 получил блокировку U страницы
процесс 2 ждет блокировку U страницы
процесс 1 получил identity
процесс 1 получил default
процесс 1 вставил запись
процесс 1 снял блокировку U страницы
процесс 2 получил блокировку U страницы

Нет там никаких U-блокировок страницы. Есть IX.
20 мар 15, 19:01    [17411635]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Oleg Krivopusk
Member

Откуда: Хабаровск
Сообщений: 50
Всем спасибо. Узнал что то новое :)

Второе поле (HID) нужно для хранения "истории". Т.е., например:
Создаем новый документ (строка). У него по умолчанию HId присваивается значение Id.
Потом при любом изменении Hid уже никогда не меняется, а вот Id работает как обычный АвтоИнкримент.
Но. Актуальное значение всегда хранится в первой созданной "строке".

Добавляем новое имя:
Id           Hid            Name       IsActual
..
10           10            Ваася       1
..

Пытаемся исправить на корректное
Id           Hid            Name       IsActual
..
10           10            Васяяяяяя       1
..
45           10            Ваася              0
..

Исправляем на корректное
Id           Hid            Name       IsActual
..
10           10            Вася            1
..
45           10            Ваася            0
..
341         10            Васяяяяяя            0
...


Таким образом по вычисляемому полю IsActual (Id = HId) всегда можно отфильтровать актуальные значения и в тоже время отсортировав по Id посмотреть всю историю изменения (кто, когда, откуда и тп). Скрипт для автоматического создания или добавления всего необходимого для таблицы или всей схемы есть.

Вот исходя из этой логики, мне тригер на вставку не удобен. Т.к. HId = Id только 1-й раз, а далее такого не нужно...
21 мар 15, 02:55    [17412966]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
а причём тут тогда sequence ? обновляйте свой HID через ХП или запросом на update
23 мар 15, 12:05    [17418457]     Ответить | Цитировать Сообщить модератору
 Re: Массовое использование SEQUENCE. Как лучше?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Oleg Krivopusk,
можно подумать о включении "Change Tacking" или "Отслеживание изменений".
23 мар 15, 12:26    [17418638]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить