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