У меня есть процесс с Select, который занимает много времени, порядка 5-10 минут.
В настоящее время я не использую NOLOCK в качестве подсказки для механизма базы данных MS SQL.
В то же время у нас есть другой процесс, выполняющий обновления и вставки в ту же базу данных и те же таблицы.
Первый процесс начался, недавно закончился преждевременно с сообщением
SQLEXCEPTION: транзакция была заблокирована для ресурсов блокировки с другим процессом и была выбрана в качестве жертвы взаимоблокировки.
Этот первый процесс выполняется на других сайтах в идентичных условиях, но с меньшими базами данных, и, таким образом, рассматриваемый оператор select занимает гораздо более короткий период времени (порядка 30 секунд или около того). На этих других сайтах я не получаю сообщения о тупике на этих других сайтах. Я также не получил этого сообщения на сайте, на котором изначально возникла проблема, но, как я полагаю, по мере роста базы данных я полагаю, что я, должно быть, преодолел некоторый порог. Вот мои вопросы:
- Может ли время, необходимое для выполнения транзакции, повысить вероятность того, что связанный процесс будет отмечен как жертва тупика.
- Если я выполню выбор с подсказкой NOLOCK, устранит ли это проблему?
- Я подозреваю, что поле datetime, которое проверяется как часть предложения WHERE в операторе select, вызывает медленное время поиска. Могу ли я создать индекс на основе этого поля? Это целесообразно?