Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Многопоточное обновление таблицы без блокировок / 18 сообщений из 18, страница 1 из 1
14.10.2020, 21:29
    #40008640
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
Добрый день. Есть задача обновления одной таблицы в многопоточном режиме
таблица секционированная по полю section, параллельно обновляются записи из разных секций.

Таблица
Код: sql
1.
2.
3.
4.
5.
create table table1 (sectionNum int, val1 int)

insert into table1 
values (1,10),
(2,30)



Первый поток:
Код: sql
1.
2.
Update table1 
set val1=15 where [sectionNum] =1



Второй поток:
Код: sql
1.
2.
Update table1 
set val1=15 where [sectionNum] =2



При параллельном выполнении UPDATE возникают блокировки deadlock.
Если это важно, то потоки вызывают хранимки в которые передается номер секции через переменную.

Я предполагал что настройка (lock_escalation = auto) для таблицы должна предотвратить блокировки, но как оказалось это не помогло.

Подскажите как реализовать подобное и избежать deadlock?
И если не для решения подобной задачи, то зачем нужна настройка lock_escalation = auto
Sql Server 2017 Enterprise
...
Рейтинг: 0 / 0
15.10.2020, 00:28
    #40008672
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452,

читайте документацию про индексы, кучи.

секционирование изначально проектировалось не под те нужды под которые вы его пытаетесь подогнать.

и на будующее: раз уж приводите примеры то приводите код структуры данных полностью, а не через призму вашего восприятия.
в предоставленном выше посте нет ни намека на какое либо секционирование.
...
Рейтинг: 0 / 0
15.10.2020, 03:00
    #40008679
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452
Добрый день. Есть задача обновления одной таблицы в многопоточном режиме
таблица секционированная по полю section, параллельно обновляются записи из разных секций.

Таблица
Код: sql
1.
2.
3.
4.
5.
create table table1 (sectionNum int, val1 int)

insert into table1 
values (1,10),
(2,30)



Первый поток:
Код: sql
1.
2.
Update table1 
set val1=15 where [sectionNum] =1



Второй поток:
Код: sql
1.
2.
Update table1 
set val1=15 where [sectionNum] =2



При параллельном выполнении UPDATE возникают блокировки deadlock.
Если это важно, то потоки вызывают хранимки в которые передается номер секции через переменную.

Я предполагал что настройка (lock_escalation = auto) для таблицы должна предотвратить блокировки, но как оказалось это не помогло.

Подскажите как реализовать подобное и избежать deadlock?
И если не для решения подобной задачи, то зачем нужна настройка lock_escalation = auto
Sql Server 2017 Enterprise


Ну, типа, серваку позволили самому решать: переходить ли на блокировку всей таблицы целиком, или так и быть - тупиться в каждую запись из этой таблицы по-отдельности (ну, вдруг в таблице всего семь строк, а таблица сильно юзается) .
...
Рейтинг: 0 / 0
15.10.2020, 08:28
    #40008704
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
felix_ff,

Согласен, извиняюсь что не указал в скрипте секционирование. А по поводу escalation_lock =auto по справке выглядит так что она заточена для работы с секциями
...
Рейтинг: 0 / 0
15.10.2020, 08:30
    #40008705
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
SIMPLicity_,

В справке вроде четко написано, что когда есть секции, то использует блокировку на уровне секций. Когда нет, то на уровне таблиц
...
Рейтинг: 0 / 0
15.10.2020, 08:31
    #40008706
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
felix_ff,

Я знаю, что такое индексы и кучи. Но не вижу связи с моей задачей
...
Рейтинг: 0 / 0
15.10.2020, 10:44
    #40008755
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452
felix_ff,

Я знаю, что такое индексы и кучи. Но не вижу связи с моей задачей


Подними веки?

Секционирование тут нужно как собаке пятая нога. Даже меньше.

1. Кластерный индекс по (sectionNum, ...чего там ишо? ). Правда, желательно огласить прочие индексы или сделать их (sectionNum, ...)
2. Ограничение числа одновременно обновляемых строк до 5000
Код: sql
1.
2.
3.
Update top(5000) table1 
set val1=15 
where [sectionNum] =1 and val1<>15
...
Рейтинг: 0 / 0
15.10.2020, 12:20
    #40008820
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
Коллеги, я тут немного извиняюсь, а где вообще видно, что таблица секционирована? У ТС только "create table table1 (sectionNum int, val1 int)" и усё.
Кластерный индекс вероятно поможет,- но мы не знаем ни чего про таблицу (ни индексов, ни к-ва строк, ни...)
Итог: гадание на сферического коня в вакууме
...
Рейтинг: 0 / 0
15.10.2020, 12:21
    #40008821
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452,

вы о чем-то не договариваете. Смотрите на фактический план выполнения, наверняка запрос сканирует все секции вместо одной.
...
Рейтинг: 0 / 0
15.10.2020, 13:10
    #40008854
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
SIMPLicity_,

Таблица создана на схеме секционирования. Секционирование по столбцу sectionNum. Это куча, индексов нет совсем. Содержит несколько тысяч записей.
...
Рейтинг: 0 / 0
15.10.2020, 13:11
    #40008856
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
Владислав Колосов,

Скорее всего да, но в том и вопрос, как этого избежать?
...
Рейтинг: 0 / 0
15.10.2020, 13:30
    #40008870
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
Для того чтобы разобраться с дидлоком, для началу нужно понять чем он вызван, а для этого анализируют граф дидлока.
...
Рейтинг: 0 / 0
15.10.2020, 14:27
    #40008898
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452
SIMPLicity_,

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


Он то плакал, то смеялся, то щетинился как ёж.
Он, гад, над нами издевался! Ну сумасшедший, что возьмешь?
(c) В.Высоцкий
...
Рейтинг: 0 / 0
15.10.2020, 18:19
    #40009027
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
aleks222,

К чему это? Лучше иногда промолчать...
...
Рейтинг: 0 / 0
16.10.2020, 08:18
    #40009110
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
Выровненный индекс по полю, по которому производится секционирование - не спасет отца русской демократии?
...
Рейтинг: 0 / 0
16.10.2020, 16:35
    #40009300
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
uaggster
Выровненный индекс по полю, по которому производится секционирование - не спасет отца русской демократии?

Построил кластеризованный индекс. Посмотрю на поведение. Что такое выровненный не знаю)
...
Рейтинг: 0 / 0
16.10.2020, 16:47
    #40009303
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
...
Рейтинг: 0 / 0
16.10.2020, 17:58
    #40009316
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточное обновление таблицы без блокировок
lex452,

авторЧто такое выровненный
Индекс секционирован так же, как и таблица.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Многопоточное обновление таблицы без блокировок / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]