Причина того, что процесс стал жертвой взаимоблокировки

У меня есть процесс с Select, который занимает много времени, порядка от 5 до 10. минут.
В настоящее время я не использую NOLOCK в качестве подсказки для механизма базы данных MS SQL.
В то же время у нас есть другой процесс, выполняющий обновления и вставки в ту же базу данных и те же таблицы.
Первый процесс запущен, недавно преждевременно завершившийся с сообщением

SQLEXCEPTION: Транзакция была заблокирована на ресурсах блокировки с другим процессом и была выбрана в качестве жертвы взаимоблокировки.

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

  1. Может ли время, необходимое для выполнения транзакции, повысить вероятность того, что связанный процесс будет отмечен как жертва тупика.
  2. Если я выполню выбор с подсказкой NOLOCK, устранит ли это проблему?
  3. Я подозреваю, что поле datetime, которое проверяется как часть предложения WHERE в операторе select, вызывает медленное время поиска.Могу ли я создать индекс на основе этого поля? Это целесообразно?
94
задан Hakan Fıstık 11 October 2016 в 16:06
поделиться