powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Многопоточное обновление таблицы без блокировок
18 сообщений из 18, страница 1 из 1
Многопоточное обновление таблицы без блокировок
    #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
Многопоточное обновление таблицы без блокировок
    #40008672
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

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

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

и на будующее: раз уж приводите примеры то приводите код структуры данных полностью, а не через призму вашего восприятия.
в предоставленном выше посте нет ни намека на какое либо секционирование.
...
Рейтинг: 0 / 0
Многопоточное обновление таблицы без блокировок
    #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
Многопоточное обновление таблицы без блокировок
    #40008704
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

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

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

Я знаю, что такое индексы и кучи. Но не вижу связи с моей задачей
...
Рейтинг: 0 / 0
Многопоточное обновление таблицы без блокировок
    #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
Многопоточное обновление таблицы без блокировок
    #40008820
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, я тут немного извиняюсь, а где вообще видно, что таблица секционирована? У ТС только "create table table1 (sectionNum int, val1 int)" и усё.
Кластерный индекс вероятно поможет,- но мы не знаем ни чего про таблицу (ни индексов, ни к-ва строк, ни...)
Итог: гадание на сферического коня в вакууме
...
Рейтинг: 0 / 0
Многопоточное обновление таблицы без блокировок
    #40008821
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

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

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

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

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


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

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

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

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


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