В настоящее время у меня возникают проблемы с частыми взаимоблокировками с конкретной пользовательской таблицей в SQL Server 2008. Вот некоторые факты об этой конкретной таблице:
- Имеет большое количество строк (от 1 до 2 миллионов)
- Все индексы, используемые в этой таблице, имеют блокировку строк ", отмеченные в их параметрах Изменить: в таблице есть только один индекс, который является его основным ключом Строки
- часто обновляются несколькими транзакциями, но являются уникальными (например, возможно, что тысячи или несколько операторов обновления выполняются для разных уникальных строк каждый час)
- таблица не использует разделы.
После проверки таблицы на sys.tables
я обнаружил, что для параметра lock_escalation
установлено значение TABLE
У меня очень соблазн включить lock_escalation для этой таблицы в DISABLE
, но я не совсем уверен, какой побочный эффект это принесет. Из того, что я понимаю, использование DISABLE
позволит свести к минимуму эскалацию блокировок с уровня TABLE
, который в сочетании с настройками блокировки строк индексов должен теоретически минимизировать взаимоблокировки, с которыми я сталкиваюсь.
Из того, что я прочитал в Определение порога для эскалации блокировки, кажется, что блокировка автоматически возрастает, когда одна транзакция извлекает 5000 строк.
Что означает одна транзакция в этом смысле? Один сеанс/соединение, получающий 5000 строк через отдельные операторы update/select?
Или это один оператор sql update/select, который извлекает 5000 или более строк?
Понятно понимать любую проницательность, btw, n00b DBA здесь
Спасибо