Хорошо, что вы опубликовали заявления и ресурсы. Чтобы полностью понять проблему, планы также будут полезны. Но я собираюсь сделать (образованное) предположение и диагностировать причину тупика как большое сканирование, происходящее в подзапросе ОБНОВЛЕНИЯ:
SELECT nobjectid
FROM (SELECT nobjectid, count(nobjectid) AS counting
FROM cds.dbo.task_core
GROUP BY nobjectid
) task_groups
WHERE task_groups.counting > 1
Этот запрос должен сканировать всю таблицу task_core. Всегда. Вы зашли в тупик на странице, потому что полное сканирование таблицы оптимизировано для использования блокировки страницы, но вы также можете попасть на уровень строки, если добавите подсказку ROWLOCK.
Чтобы устранить взаимоблокировку, необходимо устранить конфликт во время полного сканирования таблицы, который происходит в обновлении. Вместо использования «грязного» чтения можно попробовать использовать управление версиями на уровне строк, включить изоляцию моментальных снимков при чтении в базе данных, см. Общие сведения об уровнях изоляции на основе управления версиями строк .
Но намного лучшим решением было бы не сканировать в первую очередь. Сначала вернитесь к требованиям бизнес-логики и вашей модели данных. Каждый раз, когда вы видите обновление, которое требует просмотра всей таблицы , чтобы принять решение, это очень вонючий запах кода. Если вы действительно обнаружите, что обновление не может быть переписано более разумным способом (я сомневаюсь), то вам следует рассмотреть возможность использования индексированного представления. Выражения BIG_COUNT (*) разрешены в индексированных представлениях, и они значительно ускорят запрос , в дополнение к устранению причины тупика.