Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Механика удаление. Блокировки.  [new]
Начинучка
Guest
Интересует следующий вопрос.
Есть таблица (большая), в ней есть кластерный уникальный индекс по полю первичного ключа.
Из таблицы делается удаление через join c другой таблицей. Условия соединения двух таблиц идут по первичному ключу удаляемой таблицы.
В таблице примерно 300М строк. Под условие удаления попадает 50М.
Если удалять одним куском (нагрузку на лог транзакций сейчас не рассматриваем), какого уровня блокировки случатся на таблицах?
Или, как все советуют, делать удаление относительно небольшими порциями ? Как определить размер порций, чтобы с одной стороны не создавать длительных блокировок, а с другой стороны - не скатиться до построчного удаления в цикле...
20 окт 17, 12:46    [20885488]     Ответить | Цитировать Сообщить модератору
 Re: Механика удаление. Блокировки.  [new]
Начинучка
Guest
забыл написать - данные, попадающие под удаление больше никем не используются. Это, так сказать, историческая часть таблицы, которую решено было почистить из-за отсутствия надобности в удаляемых данных.

механизм секционирования красиво лег бы в нашу схему эксплуатации данных, но версия 2012 SE не внушает оптимизма в этом вопросе. :(
20 окт 17, 12:51    [20885511]     Ответить | Цитировать Сообщить модератору
 Re: Механика удаление. Блокировки.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1369
Начинучка,

Если удалять одним куском (нагрузку на лог транзакций сейчас не рассматриваем), какого уровня блокировки случатся на таблицах?


на таблице и страницах - IX на ключах индекса X
до момента когда сервер решит произвести эскалацию до уровня X на таблицу если для таблицы разрешено lock_escalation = 0

если вас не смущает "нагрузка на лог" и "попадающие под удаление больше никем не используются" то тогда можно сразу указать WITH(TABLOCKX).

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

Поэтому и советуют использовать короткие транзакции порциями около 5000 строк (образно)
20 окт 17, 13:05    [20885590]     Ответить | Цитировать Сообщить модератору
 Re: Механика удаление. Блокировки.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7771
Начинучка,

при крупной транзакции в некоторых случаях может произойти конкурирование за доступ к диску между чтением новых страниц и записью чекпойнта, в итоге запрос деградирует и сильно. Подберите опытным путем оптимальное количество строк за раз. Обычно это в районе 2-х миллионов.
20 окт 17, 13:16    [20885665]     Ответить | Цитировать Сообщить модератору
 Re: Механика удаление. Блокировки.  [new]
aleks222
Guest
Осподе, опять раздув на ровном месте?

1. Если ничего не горит - сделай job и удаляй себе понемногу. Можеш job не удалять - пущай работает и удаляет по мере надобности.

2. "Как определить размер порций?". Эмирически, карл. Удали и засеки время. Порция с временем удаления 1-5 сек. Или по фкусу.
20 окт 17, 13:38    [20885782]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить