Здравствуйте, BlackEric, Вы писали:
BE>На таблицу, 25 млн записей, самая нагруженная в проекте чтение, обновление, добавление добавили индекс (не уникальный, не кластеризованный).
BE>Таблица имеет кластеризованный первичный ключ по полю ID (uniqueidentifier). И множество других индексов и внешних ключей.
BE>Почему собственно после добавления еще одного индекса посыпались дедлоки?
BE>Я это вижу так:
BE>Таблица имеет кластеризованный индекс и новый некластеризованный индекс, который включает столбец Column.
BE>Один коннект нашел строку для обновления с помощью кластеризованного индекса и обновил страницу данных. Теперь он хочет обновить индексную страницу с новым значением Column.
BE>Другой коннект нашел ту же строку в некластеризованном индексе и установил блокировку обновления для этой строки в индексе. Блокировка обновления — это блокировка чтения, которая может удерживаться только одним коннектом. Эта блокировка обновления блокирует первый коннект. Второй теперь хочет получить блокировку обновления также на странице данных, но заблокирован первым процессом.
BE>Но как понять, тогда какой индекс вызовет дедлоки, а какой нет?
BE>Честно говоря впервые ловлю дедлок после добавления индекса.
https://www.mssqltips.com/sqlservertip/6368/sql-server-readcommittedsnapshot-database-option-and-read-commited-transaction-isolation-level/
и забудете о дедлокаъ