При попытке вызвать
ALTER INDEX [index] ON [Table] REORGANIZE
ошибка "Невозможно реорганизовать индекс поскольку отключена блокировка на уровне страницы" или "The index __ on table __ cannot be reorganized because page level locking is disabled" возникает в основном из-за перехода на платформу 8.3.22 и новее.
Причина в том, что для борьбы с эскалацией блокировок платформа теперь устанавливает гранулярность блокировок на уровне строк. Это сделано для повышения стабильности нагруженных приложений. Раньше эскалация блокировки могла произойти при обращении разных сеансов приложения к разным данным СУБД, индексы которых располагались на одной странице, и это приводило к ошибкам. Описание изменений в документации к платформе 8.3.22: dl04.1c.ru/content/Platform/8_3_22_2501/1cv8upd_8_3_22_2501.htm#717b9b91-67e4-11ec-aa69-0050569f678a
Теперь проблема устранена, однако требуется адаптация процедур реогранизации индексов при обслуживании БД, так как пока ALLOW_PAGE_LOCKS = OFF, попытка реогранизации будет приводить к ошибке. Как обойти ошибку вручную описано на ИТС (ссылка ниже).
Перестала работать и реорганизация индексов автоматизированным скриптом IndexOptimize из MaintenanceSolution от Ola Hallengren. Мне удалось переписать этот скрипт так, чтобы вместо пропуска реорганизации при выключенном флаге ALLOW_PAGE_LOCKS, он выполнял REORGANIZE временно включая блокировку страниц для индекса. То есть скрипт теперь ведёт себя именно так, как советуют на ИТС https://its.1c.ru/db/metod8dev/content/5837/hdoc:
- До дефрагментации индекса необходимо включить страничные блокировки. Пример команды: ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON);
- Выполнить дефрагментацию.
- Обратно выключить страничные блокировки. Пример команды: ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON);
Эта версия IndexOptimize обрабатывает индексы, у которых ALLOW_PAGE_LOCKS = OFF, временно им ставит ALLOW_PAGE_LOCKS = ON, а после обработки возвращает.
Вступайте в нашу телеграмм-группу Инфостарт