Lock Escalation - Что происходит здесь?

При изменении таблицы (удаление столбца) в SQL Server 2008 я нажал кнопку Generate Change Script, и я заметил, что сгенерированное изменение Script сбрасывает столбец, говорит "идти", а затем запускает дополнительный ALTER TABLE, который, как представляется, устанавливает эскалацию блокировки для таблицы в "ТАБЛИЦА". Пример:

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE)

Я также должен отметить, что это последнее, что делает изменение Script. Что он здесь делает и почему он устанавливает LOCK_ESCALATION в TABLE?

Ответ 1

" Lock Escalation - это то, как SQL обрабатывает блокировку для больших обновлений. Когда SQL собирается менять много строк, более эффективно для механизма базы данных брать меньше блокировок (например, целую таблицу), вместо того, чтобы блокировать многие мелкие вещи (например, блокировки строк).

Но это может быть проблематично, когда у вас огромная таблица, потому что фиксация всей таблицы может блокировать другие запросы в течение длительного времени. То, что компромисс: многие блокировки с небольшой степенью детализации медленнее, чем меньше (или одного) крупнозернистых замков, и с несколькими запросами, блокирующими разные части таблицы, создает возможность для взаимоблокировки, если один процесс ожидает другой.

Существует параметр уровня таблицы, LOCK_ESCALATION, новый в SQL 2008, который позволяет контролировать эскалацию блокировки. По умолчанию "TABLE" позволяет блокировать все уровни до уровня таблицы. В большинстве случаев функция DISABLE предотвращает эскалацию блокировки во всей таблице. AUTO позволяет блокировать таблицы, за исключением случаев, когда таблица разделена, и в этом случае блокировки выполняются только до уровня раздела. См. этот пост в блоге для получения дополнительной информации.

Я подозреваю, что среда IDE добавляет этот параметр при повторном создании таблицы, потому что TABLE является значением по умолчанию в SQL 2008. Обратите внимание, что LOCK_ESCALATION не поддерживается в SQL 2005, поэтому вам нужно снять его, если пытаетесь запустить script в экземпляре 2005 года. Кроме того, поскольку TABLE по умолчанию, вы можете безопасно удалить эту строку при повторном запуске script.

Также обратите внимание, что в SQL 2005 до того, как этот параметр присутствовал, все блокировки могут перерасти в уровень таблицы - другими словами, "TABLE" был единственным параметром в SQL 2005.

Ответ 2

Вы можете проверить, нужно ли включать оператор LOCK_ESCALATION в script, сравнивая это значение до и после запуска основной части вашего script:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename'

В моем случае изменение таблицы для удаления или добавления ограничения не изменяет это значение.