Разница между уровнем строки и блокировкой уровня страницы и последствия

10

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

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

В настоящее время у нас включена блокировка уровня строки для этого индекса. Я могу включить блокировку на уровне страницы, но я не уверен, каковы будут последствия.

Мой вопрос: в чем разница между двумя схемами блокировки и каковы их реальные (в производстве) последствия?

Лук-Knight
источник

Ответы:

14

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

План техобслуживания должен пытаться выполнить изменение указателя ALTER INDEX, которое является онлайн-операцией. Чтобы удалить фрагментацию (страницы не в порядке), страницы должны быть заблокированы и перемещены, что невозможно, если блокировки страниц были отключены. Единственный способ дефрагментировать без блокировок страницы - это заблокировать весь раздел, что невозможно для РЕОРГАНИЗАЦИИ, так как он только онлайн.

В чем разница между двумя схемами блокировки и каковы их реальные (в производстве) последствия?

Вам необходимо понять, что такое запись и страница, чтобы оценить влияние запрета на определенный тип блокировки. Если вы не знакомы с внутренними компонентами хранилища SQL Server, начните с Анатомии записи и Анатомии страницы . Проще говоря:

  • строки = записи
  • строки хранятся в страницах 8 КБ

Если вы хотите изменить разрешенные типы блокировки:

  • Отключить блокировки страниц = только блокировки строк и таблиц
  • Отключить блокировки строк = только блокировки страниц и таблиц
  • Отключить оба = только блокировки таблицы

Мне известно о двух сценариях, в которых может быть полезно запретить тип блокировки. Это не значит, что других нет, надеюсь, кто-то еще вступит с примерами.

Часто используемая справочная таблица, которая меняется нечасто: отключив блокировки на уровне страниц и строк, все читатели получат общую блокировку таблицы. Это быстрее / дешевле, чем обычное общее намерение в таблице, за которым следует общее намерение на странице и, наконец, общая блокировка для определенной строки или строк.

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

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

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

Марк Стори-Смит
источник
9

Наверное, ничего. Я уверен, что MS знает лучше, чем вы или я

Я работал на больших системах OLTP и никогда не чувствовал необходимости менять настройки. Тупик должен быть повторен, потому что они все равно произойдут

Цитата из блога SQL Server Storage Engine, «Повышение блокировки в SQL2005», о котором все равно стоит прочитать полностью.

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

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

Я подозреваю, что за этим стоит какое-то суеверие, вот так:

ГБН
источник
+1, но: можно предотвратить взаимные блокировки в системах OLTP; моя система работает без тупиков в течение нескольких месяцев, хотя мы используем ее 2-3 раза в неделю.
АК