У мене є процес із Select, який потребує тривалого часу, на замовлення від 5 до 10 хвилин.
Наразі я не використовую NOLOCK як підказку до двигуна бази даних MS SQL.
У той же час у нас є ще один процес, який здійснює оновлення та вставки в ту саму базу даних і ті самі таблиці.
Перший процес розпочався, нещодавно передчасно закінчившись повідомленням
SQLEXCEPTION: трансакція зайшла в тупик на ресурсах блокування з іншим процесом і була обрана в якості жертви тупикового кута.
Цей перший процес працює на інших сайтах в однакових умовах, але з меншими базами даних, і, таким чином, відповідний оператор select займає набагато коротший проміжок часу (приблизно 30 секунд). На цих інших сайтах я не отримую повідомлення про тупик на цих інших сайтах. Я також не отримав цього повідомлення на сайті, який спочатку має проблеми, але, я припускаю, що база даних зросла, я вважаю, що, мабуть, переступив якийсь поріг. Ось мої запитання:
- Чи може час, який потрібен для здійснення транзакції, зробить пов’язаний процес більш імовірним, що він буде позначений як жертва тупикової ситуації.
- Якщо я виконаю виділення з підказкою NOLOCK, чи усуне це проблема?
- Я підозрюю, що поле дати, яке перевіряється як частина пункту WHERE в операторі select, викликає повільний час пошуку. Чи можна створити індекс на основі цього поля? Це доцільно?