Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Новая опция WAIT_AT_LOW_PRIORITY в команде DBCC SHRINKDATABASE предоставляет возможность снизить конкуренцию за блокировки во время сжатия базы или файла, заставляя сжатие пережидать окончание других операций на сервере, блокирующих сжатие. Это похоже на опцию WAIT_AT_LOW_PRIORITY для онлайн операций с индексами, но с некоторыми отличиями.
Конкурентами сжатия всей базы данных или её файла могут быть операции перестроение индексов, или запросы в нагруженных OLTP - приложениях. Обычная выборка сопровождается блокировкой стабильности схемы (Sch-S), а сжатие базы или файла использует блокировку изменения схемы (Sch-M), которая нужна для перемещения или удалении страниц IAM. Получается, что долгие выборки могут блокировать операцию сжатия, пока не будут завершены. Также, эта ситуация может привести к тому, что новые выборки с блокировкой Sch-S будут ждать завершения операции сжатия, и всё это время будут ей заблокированы. Кроме этого, операции сжатия могут быть заблокированы транзакцией, запущенной с уровнем изоляции, основанном на управлении версиями строк. Всё это в прежних версиях было причиной заметного снижения производительности запросов, а также бывало проблемой при необходимости сжатия файлов базы данных.
Новая функция в SQL Server 2022 (16.x) позволяет сжатию ожидать с низким приоритетом (WLP), за счёт того, что блокировка изменения схемы накладывается в специальном, новом режиме WAIT_AT_LOW_PRIORITY. Если операция сжатия в этом режиме не может получить блокировку Sch-M по указанным ранее причинам дольше 1 минуты, сжатие завершится без ошибок. По истечении времени ожидания в журнал ошибок SQL Server будет отправлено сообщение с идентификатором 49516. Пример:
Msg 49516, Level 16, State 1, Line 134 Shrink timeout waiting to acquire schema modify lock in WLP mode to process IAM pageID 7:7777 on database ID 7.
Если это допустимо, после такого сообщения можно просто снова повторить операцию сжатия в режиме WLP.
Подробности того, какие операции могут заблокировать сжатие, можно найти на странице Общие сведения о проблемах с параллелизмом в DBCC SHRINKDATABASE.
Примечание: с опцией WAITATLOWPRIORITY нельзя использовать параметр ABORTAFTER_WAIT NONE.