Как работает механизм блокировок при попытке удалить большое количество данных?

Рейтинг: 2Ответов: 1Опубликовано: 18.07.2023

Предположим у нас есть таблица с миллионом строк: id инкремент и любые столбцы с данными.

Я знаю, что попытка удалить большое количество данных из таблица рождает проблему блокировок, но с самим их механизмом знаком очень-очень поверхностно

Подскажите, пожалуйста:

  1. Что будет, если я напишу запрос, удаляющий 90% записей (delete t from table as t where id<900000)? Опишите, пожалуйста, детально схему блокировок (я интуитивно предполагаю, что изначально вся таблица должна быть заблочена чем-то вроде UIX, а затем постепенно будут выдаваться X-блокировки на какое-то количество строк/страниц).
  2. У нас на проекте для подобных операций используется "порционное удаление" по несколько тысяч записей за раз. Как мне объясняли, есть некий лимит строк, при запросе на удаление которого, таблица как-то страшно блокируется (Sch-M?). Подскажите, какое количество строк есть та верхняя граница, после которой таблица блокируется намертво и как именно это происходит?

Ответы

▲ 1Принят

Ответ нашёлся в понятии об "эскалации блокировок" - гугл в помощь

Грубо говоря, когда на один объект накладывается более 5000 блокировок (ещё есть вариант с тем, что превышен лимит памяти) на более низком уровне, ms sql считает рациональным заблочить объект на более высоком.

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