Я пытаюсь устранить проблему с блокировкой, которая происходит менее секунды. Приложение OLTP очень чувствительно и должно иметь время отклика менее 200 мс для некоторых транзакций в соответствии с согласованным SLA. У нас были проблемы с эскалацией блокировки в новом выпуске кода, которые мы смогли решить, уменьшив размер пакета в обновлениях. Мы подозреваем, что даже при небольшом размере пакета новый sp блокирует те же строки, которые обновляет транзакция OLTP.
Мне нужно найти сеанс, который блокируется, и ресурс, на котором он находится. Насколько я понимаю, «порог заблокированного процесса» может быть установлен как минимум на 1 секунду, поэтому блокировка не будет зафиксирована.
Я экспериментирую с событиями wait_info и wait_completed x.
Есть ли другой способ, которым мы могли бы это отследить. Благодарность
Ответы:
Поскольку вас особенно интересует блокировка, а не общие ожидания,
locks_lock_waits
расширенное событие звучит более подходящим.С фильтром на
increment >= 200
Выше собраны операторы, ожидающие блокировки в течение порогового количества времени, но не дают конкретного ресурса блокировки.
Я никогда не использовал это событие и не понимаю, какие издержки может вызвать эта сессия на вашем производственном сервере.
Я нашел это видео по теме. Это настоятельно рекомендует фильтрацию на
counter
чтобы уменьшить количество собранных событий, и я сделал это выше.Также упоминается старая устаревшая недокументированная команда
Который (если флаг трассировки 3605 включен) сбрасывает ограниченную информацию, такую как ниже, в журнал ошибок SQL Server.
Я просто упомянул об этом мимоходом, поскольку расширенные события были бы явно предпочтительнее в любом случае, поскольку они задокументированы и намного более эффективны.
источник
dbcc lock(StallReportThreshold, 200)
сначала, и он выводит информацию, как только пороговое значение превышено, если включен флаг трассировки 3605. SQL Server не собирает эту информацию на случай, если вы сможете запустить ее позже.Если вы заинтересованы в блокировке, доступно несколько расширенных событий:
Первые два события имеют
duration
столбец в (микросекунды), который вы можете отфильтровать по вашим порогам. У них также естьresource_description
действие, которое даст вам некоторую информацию о задействованных ресурсах.В
lock_escalation
событии также естьstatement
действие, которое вы можете добавить, чтобы собрать инструкцию T-SQL, которая вызвала эскалацию блокировки. Это также имеетescalation_cause
. Вот пример сеанса:Я подозреваю, что, возможно, есть причина, по которой вы не можете установить порог отчета о заблокированном процессе менее чем на секунду: блокировка совершенно нормальна в СУБД - ядро базы данных должно блокировать ресурсы для их защиты. Хотя нет официального определения того, когда блокировка становится блокировкой, блокировка, тикающая в течение секунды, кажется для меня нормальным явлением.
источник