Mam proces z Select, który zajmuje dużo czasu, w kolejności od 5 do 10 minut.
Obecnie nie używam NOLOCK jako wskazówki do silnika bazy danych MS SQL.
W tym samym czasie mamy inny proces, który dokonuje aktualizacji i wstawia do tej samej bazy danych i tych samych tabel.
Rozpoczął się pierwszy proces, który niedawno zakończył się przedwcześnie przekazem wiadomości
SQLEXCEPTION: transakcja została zablokowana na zasobach blokady z innym procesem i została wybrana jako ofiara zakleszczenia.
Ten pierwszy proces przebiega w innych witrynach w identycznych warunkach, ale z mniejszymi bazami danych, a zatem omawiana instrukcja select zajmuje znacznie krótszy okres czasu (rzędu około 30 sekund). W innych witrynach nie widzę komunikatu o zakleszczeniu w innych witrynach. Również nie dostałem tego komunikatu na stronie, na której początkowo występuje problem, ale zakładam, że wraz z rozrostem bazy danych, wydaje mi się, że przekroczyłem jakiś próg. Oto moje pytania:
- Czy czas potrzebny na wykonanie transakcji może zwiększyć prawdopodobieństwo, że powiązany proces zostanie oflagowany jako ofiara zakleszczenia?
- Jeśli wykonam selekcję ze wskazówką NOLOCK, czy spowoduje to usunięcie problemu?
- Podejrzewam, że pole datetime, które jest sprawdzane jako część klauzuli WHERE w instrukcji select, powoduje powolny czas wyszukiwania. Czy mogę utworzyć indeks na podstawie tego pola? Czy to jest wskazane?