Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
Вопрос такой.
Имеется таблица из двух полей:
create table t ( t_id int, num int)

Также имеется диапазон значений num : 1 .. 10000
В таблице t_id уникальны, num из указанного диапазона.
Задача в следующем.
Есть хранимая процедура.
На входе в нее передается параметр @t_id.
Нужно найти минимальную свободную (т.е. не содержится в таблице) позицию из диапазона и записать в таблицу (@t_id, эта позиция). Процедуру одновременно вызывают из большого числа соединений, не должны записываться и возвращаться одинаковые значения для них.
16 янв 17, 17:46    [20111408]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37202
Завести таблицу с записями 1...10000, после чего выбирать из нее первую запись, которой нет в t.
16 янв 17, 17:50    [20111433]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
Гавриленко Сергей Алексеевич,
Такая таблица есть ),
проблема не в этом. Два параллельных запроса выбирают одну и ту же запись.
Первый запрос уже выбрал запись, но не успел еще ее записать, второй выбирает ту же самую.
16 янв 17, 18:00    [20111471]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ASQLUser,

переходите к изучению уровней изоляции
16 янв 17, 18:02    [20111484]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Значит, нужно еще поле, куда писать количество считываний и ограничение на "непорочный" счетчик чтений...
и тут вопрос, а какова цель этого циркового представления?
16 янв 17, 18:03    [20111486]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Руслан Дамирович
Значит, нужно еще поле, куда писать количество считываний и ограничение на "непорочный" счетчик чтений...
и тут вопрос, а какова цель этого циркового представления?

что???
16 янв 17, 18:04    [20111489]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
TaPaK
Руслан Дамирович
Значит, нужно еще поле, куда писать количество считываний и ограничение на "непорочный" счетчик чтений...
и тут вопрос, а какова цель этого циркового представления?

что???

А где сказано, что что-то там со счетчиком будет происходить в одной транзакции?
Додумывать за автором сейчас вообще не пойми какой костыль - ишь, транзЪкция окаянныя!
Да вы, батенька, салатиков на новый год переели :)
16 янв 17, 18:06    [20111493]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Руслан Дамирович
TaPaK
пропущено...

что???

А где сказано, что что-то там со счетчиком будет происходить в одной транзакции?
Додумывать за автором сейчас вообще не пойми какой костыль - ишь, транзЪкция окаянныя!
Да вы, батенька, салатиков на новый год переели :)

как забыть оба ваши комментария...
16 янв 17, 18:09    [20111508]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
TaPaK
ASQLUser,

переходите к изучению уровней изоляции


Ценю Ваш совет, Вы открыли мне глаза.
По делу сказать что-то можете?
16 янв 17, 18:18    [20111536]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ASQLUser
TaPaK
ASQLUser,

переходите к изучению уровней изоляции


Ценю Ваш совет, Вы открыли мне глаза.
По делу сказать что-то можете?

ленивые все стали....
SET TRANSACTION ISOLATION LEVEL READ COMMITED/SERIALIZABLE
BEGIN TRAN 
выбрали
вставили
COMMIT
16 янв 17, 18:20    [20111546]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
Руслан Дамирович
Значит, нужно еще поле, куда писать количество считываний и ограничение на "непорочный" счетчик чтений...
и тут вопрос, а какова цель этого циркового представления?


С полями идеи не понял.
Цель вполне прозаическая, трюками не занимаюсь. Упростил задачу, убрав бизнес-логику. К SQL она отношения не имеет.
16 янв 17, 18:22    [20111554]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
TaPaK
ASQLUser
пропущено...


Ценю Ваш совет, Вы открыли мне глаза.
По делу сказать что-то можете?

ленивые все стали....
SET TRANSACTION ISOLATION LEVEL READ COMMITED/SERIALIZABLE
BEGIN TRAN 
выбрали
вставили
COMMIT


SERIALIZABLE - жестоко, вылезают дедлоки.
READ COMMITED не мешает захватывать дубли, блокировка не висит постоянно внутри транзакции.
16 янв 17, 18:42    [20111613]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ASQLUser
TaPaK
пропущено...

ленивые все стали....
SET TRANSACTION ISOLATION LEVEL READ COMMITED/SERIALIZABLE
BEGIN TRAN 
выбрали
вставили
COMMIT


SERIALIZABLE - жестоко, вылезают дедлоки.
READ COMMITED не мешает захватывать дубли, блокировка не висит постоянно внутри транзакции.

танунафиг... создавайте поля
16 янв 17, 18:44    [20111618]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
aleks2
Guest
ASQLUser
Вопрос такой.
Имеется таблица из двух полей:
create table t ( t_id int, num int)

Также имеется диапазон значений num : 1 .. 10000
В таблице t_id уникальны, num из указанного диапазона.
Задача в следующем.
Есть хранимая процедура.
На входе в нее передается параметр @t_id.
Нужно найти минимальную свободную (т.е. не содержится в таблице) позицию из диапазона и записать в таблицу (@t_id, эта позиция). Процедуру одновременно вызывают из большого числа соединений, не должны записываться и возвращаться одинаковые значения для них.


create table t ( t_id int, num int identity(1, 1))

И не фантазируйте - все придумано до вас.

ЗЫ. Тока не говорите, что вам еще и удалять надо.
16 янв 17, 20:36    [20112000]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
update t
 set
  num = a.num
from
 dbo.t t cross apply
 (select top (1) num from Диапазон d with (updlock, readpast) where not exists(select 1 from dbo.t where num = d.num order by d.num) a
where
 t.t_id = @t_id;
Плюс уникальный индекс Диапазон (num) и уникальный фильтрованный индекс t (num) where num is not null.
16 янв 17, 21:43    [20112202]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
aleks2

create table t ( t_id int, num int identity(1, 1))

И не фантазируйте - все придумано до вас.

ЗЫ. Тока не говорите, что вам еще и удалять надо.


Как Вы думаете, зачем я так подробно описал задачу?
Да, нужно удалять, да identity не подходит.
17 янв 17, 10:37    [20113295]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
invm
update t
 set
  num = a.num
from
 dbo.t t cross apply
 (select top (1) num from Диапазон d with (updlock, readpast) where not exists(select 1 from dbo.t where num = d.num order by d.num) a
where
 t.t_id = @t_id;
Плюс уникальный индекс Диапазон (num) и уникальный фильтрованный индекс t (num) where num is not null.


Идея понятна, а почему order by во вложенном подзапросе?
Фильтрованный индекс по t(num) должен быть с полным покрытием полей в t или это не обязательно?
Жалко, что "из коробки" решение не подходит (уникальный индекс Диапазон (num) создать нельзя), но попробую допилить напильником )
17 янв 17, 13:59    [20114269]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
ASQLUser
а почему order by во вложенном подзапросе?
Потому что "Нужно найти минимальную свободную (т.е. не содержится в таблице) позицию из диапазона", что и делает подзапрос в cross apply.
ASQLUser
Фильтрованный индекс по t(num) должен быть с полным покрытием полей в t или это не обязательно?
Что имеется в виду? include остальных столбцов? Так это зависит от того, где индекс планируется применять. Для данного запроса достаточно только ключ по num, без include.
ASQLUser
уникальный индекс Диапазон (num) создать нельзя
Это плохо.
Без такого индекса запрос может ничего не найти, хотя на самом деле подходящие данные будут.

ЗЫ: Возможно индексы придется указывать принудительно хинтами. План запроса покажет нужно ли это.
17 янв 17, 14:17    [20114335]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
invm,
автор
Потому что "Нужно найти минимальную свободную (т.е. не содержится в таблице) позицию из диапазона", что и делает подзапрос в cross apply.
промахнулись со скобкой, order в exists
17 янв 17, 14:23    [20114360]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
invm
Member

Откуда: Москва
Сообщений: 9688
TaPaK
промахнулись со скобкой, order в exists
Да, точно.
17 янв 17, 14:36    [20114432]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
aleks2
Guest
ASQLUser
aleks2
create table t ( t_id int, num int identity(1, 1))

И не фантазируйте - все придумано до вас.

ЗЫ. Тока не говорите, что вам еще и удалять надо.


Как Вы думаете, зачем я так подробно описал задачу?
Да, нужно удалять, да identity не подходит.


Это у вас плохо с воображением.

Любая задача может быть решена двумя путями:
а) просто.
б) через жопу.

Пока ваш путь б).
17 янв 17, 15:21    [20114736]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
invm
ASQLUser
уникальный индекс Диапазон (num) создать нельзя
Это плохо.
Без такого индекса запрос может ничего не найти, хотя на самом деле подходящие данные будут.

ЗЫ: Возможно индексы придется указывать принудительно хинтами. План запроса покажет нужно ли это.


С первыми двумя понятно:
в первом смутила скобка, так и подумал, что просто ошибка, но решил уточнить.
со вторым понятно, уточнил на всякий случай.
В третьем да, может получиться tablock и readpast ничего не найдет.
Сделать без readpast?
17 янв 17, 18:05    [20115615]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ASQLUser
invm
пропущено...
Это плохо.
Без такого индекса запрос может ничего не найти, хотя на самом деле подходящие данные будут.

ЗЫ: Возможно индексы придется указывать принудительно хинтами. План запроса покажет нужно ли это.


С первыми двумя понятно:
в первом смутила скобка, так и подумал, что просто ошибка, но решил уточнить.
со вторым понятно, уточнил на всякий случай.
В третьем да, может получиться tablock и readpast ничего не найдет.
Сделать без readpast?

ну да, с учётом того что весь запрос построен на использовании READPAST сделайте без него
17 янв 17, 18:07    [20115627]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
ASQLUser
Guest
TaPaK
ASQLUser
пропущено...


С первыми двумя понятно:
в первом смутила скобка, так и подумал, что просто ошибка, но решил уточнить.
со вторым понятно, уточнил на всякий случай.
В третьем да, может получиться tablock и readpast ничего не найдет.
Сделать без readpast?

ну да, с учётом того что весь запрос построен на использовании READPAST сделайте без него


Запрос не построен на READPAST, хотя это эффективный способ обойти лишние блокировки.
И еще.
По идее rowlock блокирует даже при неуникальном индексе, но требуется покрытие индексом выбираемых столбцов.
17 янв 17, 18:20    [20115668]     Ответить | Цитировать Сообщить модератору
 Re: Поиск уникальной ячейки в диапазоне  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ASQLUser
TaPaK
пропущено...

ну да, с учётом того что весь запрос построен на использовании READPAST сделайте без него


Запрос не построен на READPAST, хотя это эффективный способ обойти лишние блокировки.
И еще.
По идее rowlock блокирует даже при неуникальном индексе, но требуется покрытие индексом выбираемых столбцов.

это просто клиника
17 янв 17, 18:21    [20115671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить