Обзор

Укрупнение блокировки — это процесс преобразования многих детализированные блокировок (например, блокировки строк или страниц) в блокировки таблиц. Microsoft SQL Server динамически определяет, когда следует выполнять укрупнение блокировки. При принятии этого решения, SQL Server учитывает число блокировок, удерживаемых в определенном просмотре число блокировок, удерживаемых по всей транзакции и объем памяти, который используется для блокировки в системе в целом. Как правило укрупнение блокировки происходит только в тех точках, где его повышения производительности или когда необходимо уменьшить чрезмерное блокировки памяти до более разумного уровня приводит SQL Server по умолчанию. Тем не менее некоторые макеты приложения или запрос может инициировать укрупнение блокировок на время является нежелательным, и блокировка эскалированных таблицы может блокироваться другие пользователи. В этой статье описываются способы определения является ли причиной укрупнение блокировки и как обращаться с нежелательным укрупнение блокировок.

Дополнительные сведения

Как определить, вызывает ли укрупнение блокировки

Большинство блокирующих проблем не вызывает укрупнение блокировки. Чтобы определить ли укрупнение блокировки происходит вокруг времени, когда возникают проблемы, запуск трассировки SQL Profiler, включающий событий Lock: Escalation . Если вы не видите никаких событий Lock: Escalation укрупнение блокировки не происходит на сервере и информация в данной статье относится к вашей ситуации.

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

Дополнительные сведения о том, как идентифицировать head блокирования и способы идентификации ресурса блокировки, удерживаемые head окон, который блокирует другие серверного процесса (SPID), идентификаторы щелкните следующий номер статьи базы знаний Майкрософт:

Общие сведения о 224453 и устранение блокирующих проблем 2000 или SQL Server 7.0

Если блокировка мешает другим пользователям только на ВКЛАДКЕ () блокировка таблицы с режимом блокировки S (общая) и X (монопольная), укрупнение блокировки не проблема. В частности Если блокировка ВКЛАДКУ блокировку с намерением (например, режим блокировки IS, IU или IX), это не результат укрупнения блокировок. Если проблемы с блокировками не вызвана укрупнение блокировки, содержатся в статье Q224453 шаги по устранению неполадок.

Как предотвратить распространение блокировки

Простейшим и наиболее безопасным способом предотвращения укрупнение блокировки, ограничивайте объем транзакций и сократить объем блокировок ресурсоемких запросов, чтобы не превышены Пороги укрупнения блокировок. Существует несколько способов получения этой цели, многие из которых перечислены:

  • Разбейте крупные пакетные операции в нескольких небольших операций. Предположим, например, прошел следующий запрос, чтобы удалить несколько сотен тысяч старых записей в таблицу аудита, и затем найти приводит укрупнение блокировки других пользователей:

    DELETE FROM LogMessages WHERE LogDate < '2/1/2002'

    При удалении этих сотен записей одновременно, значительно снижают количество блокировок, которые накапливаются на проводку и предотвратить распространение блокировки. Например:

    SET ROWCOUNT 500
    delete_more:
    DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
    IF @@ROWCOUNT > 0 GOTO delete_more
    SET ROWCOUNT 0
  • Уменьшите объем запросов блокировки, сделав запрос как можно эффективнее. Сканирование больших объемов или большим количеством просмотров Закладка может увеличить вероятность укрупнение блокировки; Кроме того он повышает вероятность возникновения взаимоблокировок и обычно отрицательно сказывается на производительности и параллелизма. После обнаружения запроса, вызывает укрупнение блокировки, поиск искать возможности для создания новых индексов или для добавления существующего индекса для удаления индекса или таблицы сканирования и эффективность индекса столбцов. Рассмотрите возможность вставки запрос в окно запроса Query Analyzer для выполнения анализа автоматического индекса. Для этого в меню запрос выберите команду Мастер настройки индексов в SQL Server 2000 или щелкните Выполнить анализ индекса в SQL Server 7.0.

    Одной из целей этой оптимизации, чтобы сделать индекс поиска возвращает столько строк можно свести к минимуму затраты на поиск закладки (максимизировать избирательность индекса для определенного запроса). Если SQL Server оценивает, что поиск закладки логический оператор может вернуть несколько строк, он выполняет поиск закладки с помощью упреждающей ВЫБОРКИ. Если SQL Server использует упреждающей ВЫБОРКИ для просмотра закладки, его необходимо увеличить уровень изоляции транзакции часть запроса на повторяющееся чтение для части запроса. Это означает, что как может выглядеть инструкция SELECT с уровнем изоляции read-committed может стать многие тысячи ключа блокировки (кластеризованный индекс и одним некластеризованным индексом), которые могут вызвать запрос к превышению укрупнения блокировки. Это особенно важно, если обнаружится, что эскалированных блокировки является совмещаемая блокировка таблицы, который, однако, не видны обычно по умолчанию на уровне изоляции read committed. Если закладка подстановки с упреждающей ВЫБОРКИ предложение вызывает укрупнение, рассмотрите возможность добавления дополнительных столбцов некластеризованного индекса, который отображается в Index Seek или Index Scan логический оператор ниже логический оператор поиск закладки в плане запроса. Можно создать индекс покрытия (индекса, включающего все столбцы в таблице, которые использовались в запросе), или по крайней мере индекс, охватывающий столбцы, которые используются для объединения условий в предложении WHERE Если включая все элементы в столбце выберите список i s является нецелесообразным.

    Вложенный цикл соединения также могут использовать упреждающей ВЫБОРКИ, и это приводит к тому же режим блокировки.

    Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:

    260652 Nested цикла соединения, использующего «ЗАКЛАДКИ поиска... С упреждающей ВЫБОРКИ» может содержать больше времени блокировки

  • Укрупнение блокировки не может возникать, если различных SPID в настоящее время удерживает блокировку таблицы несовместимы. Укрупнение блокировки всегда перехода для блокировки таблицы и никогда не блокировки страниц. Кроме того Если попытка укрупнения блокировки происходит сбой, так как несовместимая блокировка ВКЛАДКА содержит другой SPID, запрос, который будет предпринята попытка эскалации не блокируется во время ожидания блокировки ВКЛАДКИ. Вместо этого он продолжает блокировки на уровне исходного и более детальный (строки, раздела или страницы), периодически вносить дополнительные эскалации попыток. Таким образом одним из способов предотвращения укрупнения блокировок в конкретной таблице — приобретения и блокировку другое подключение, не совместим с типом эскалированных блокировки. Блокировку IX (намерением монопольного доступа) на уровне таблицы не блокирует все строки или страницы, но это по-прежнему не совместим с расширенными S (общая) и X (монопольная) ВКЛАДКУ блокировка. Например, предположим, что необходимо запустить пакетное задание, которое изменяет большое число строк в таблице mytable и вызвал, возникает из-за укрупнения блокировки. Если данное задание всегда завершается в менее чем за час, может создать задание Transact-SQL, содержащий следующий код и новые задания для запуска нескольких минут до времени начала пакетного задания:

    BEGIN TRAN
    SELECT * FROM mytable (UPDLOCK, HOLDLOCK) WHERE 1=0
    WAITFOR DELAY '1:00:00'
    COMMIT TRAN

    Этот запрос получает и удерживает блокировку IX на mytable один час, что предотвращает укрупнение блокировки на таблицу в это время. Этот пакет не изменять любые данные и не блокируются другие запросы (если другой запрос вызывает блокировку таблицы с подсказкой TABLOCK или если администратор отключил блокировок строк или страниц с помощью sp_indexoption хранимой процедуры).

Кроме того можно отключить укрупнение блокировки при включении флага трассировки 1211. Тем не менее этот флаг трассировки отключает все укрупнения блокировки глобально в экземпляре SQL Server. Укрупнение блокировок служит полезным цели в SQL Server путем увеличения эффективности запросов, которые в противном случае замедляли, дополнительные издержки на получение и выпуск блокировки несколько тысяч. Укрупнение блокировки также помогает свести к минимуму необходимого количества памяти для отслеживания блокировок. Память, SQL Server может динамически выделять для структур блокировки ограничено, поэтому при отключении укрупнение блокировки и блокировки памяти растет достаточно большой, выполняет попытку выделить дополнительное блокировки для любого запроса, может произойти сбой и появляется следующее сообщение об ошибке:


Ошибка: 1204, уровень серьезности: 19, состояние: 1
В настоящее время SQL Server не удалось получить ресурс БЛОКИРОВКИ. Запустите инструкцию повторно, когда число активных пользователей, или обратиться к системному администратору, чтобы проверить конфигурацию блокировки и памяти SQL Server.

Примечание. При возникновении ошибки «1204», он прекращает обработку текущего оператора и влечет за собой откат активной транзакции. Откат сам может блокировать пользователей или привести к времени восстановления базы данных long, если перезапустить службу SQL Server.

Только с использованием подсказки блокировки ROWLOCK как изменяет план начальная блокировка. Подсказки блокировки не препятствуют укрупнения блокировки.



Другие методы укрупнение блокировки, описанные ранее в этой статье, лучшие варианты, чем включение флага трассировки. Кроме того другие методы обычно обеспечить лучшую производительность для запроса, чем отключение укрупнения блокировок для всего экземпляра. Корпорация Майкрософт рекомендует включать этот флаг трассировки только для устранения серьезной блокировки, вызываемое укрупнение блокировки при другие параметры, такие как эти описанных ранее в этой статье она исследуется. Чтобы включить флаг трассировки, он включен каждый раз, когда SQL Server запускается, добавить его в качестве параметра запуска сервера.

Добавление параметра запуска сервера, щелкните правой кнопкой мыши в Enterprise Manager SQL server, нажмите кнопку Свойствана вкладке Общие нажмите кнопку Параметры запускаи затем добавьте следующий параметр (точно как показано):

-T1211Должен проходить службу SQL Server для нового параметра запуска вступили в силу. При запуске следующего запроса в Query Analyzer флаг трассировки вступает в силу немедленно:

DBCC TRACEON (1211, -1)

Тем не менее если не использовать -T1211 параметра запуска эффекта traceon команда теряется при циклах службы SQL Server. Включите флаг трассировки предотвращает любые будущие укрупнение, но это не изменяет все укрупнения блокировок, которые уже произошли в активной транзакции.

Нужна дополнительная помощь?

Совершенствование навыков

Перейти к обучению >

Первоочередный доступ к новым возможностям

Присоединение к программе предварительной оценки Майкрософт >

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?
Что повлияло на вашу оценку?

Спасибо за ваш отзыв!

×