Przyczyna procesu będącego ofiarą impasu

Mam proces Z Select, który zajmuje dużo czasu, aby zakończyć, w kolejności od 5 do 10 minut.
Obecnie nie używam NOLOCKA jako podpowiedzi do silnika bazy danych MS SQL.
w tym samym czasie mamy inny proces wykonujący aktualizacje i wstawianie do tej samej bazy danych i tych samych tabel.
rozpoczął się pierwszy proces, który kończy się przedwcześnie Komunikatem

SqlException: transakcja została zablokowana na zablokowanych zasobach innym procesem i została wybrana jako ofiara impasu.

Ten pierwszy Proces jest uruchamiany w innych lokalizacjach w identycznych warunkach, ale z mniejszymi bazami danych, a zatem dana instrukcja select zajmuje znacznie krótszy okres czasu (rzędu 30 sekund lub więcej). Na tych innych stronach nie dostaję wiadomości o impasie w tych innych stronach. I również nie dostał ten Komunikat na stronie, która ma problem początkowo, ale, zakładam, jak baza danych wzrosła, myślę, że musiałem przekroczyć niektóre próg. Oto moje pytania:

  1. Czy czas potrzebny na wykonanie transakcji może zwiększyć prawdopodobieństwo, że powiązany proces zostanie oznaczony jako ofiara impasu?
  2. jeśli wykonam select z podpowiedzią NOLOCK, czy to usunie problem?
  3. podejrzewam, że pole datetime, które jest zaznaczone jako część klauzuli WHERE w instrukcji select powoduje powolny czas wyszukiwania. Czy mogę utworzyć indeks na podstawie tego pola? Czy to wskazane?
Author: Hakam Fostok, 2011-12-05

3 answers

P1: Czy czas potrzebny na wykonanie transakcji może zwiększyć prawdopodobieństwo, że powiązany proces zostanie oznaczony jako ofiara impasu?

Nie. SELECT jest ofiarą, ponieważ tylko odczytywał dane, dlatego transakcja ma niższy koszt związany z nią, więc jest wybierana jako ofiara:

Domyślnie silnik bazy danych wybiera jako ofiarę impasu sesja uruchamiająca transakcję, która jest najtańsza do cofnięcia . Alternatywnie, użytkownik może określić priorytet sesji w sytuacja impasu przy użyciu SET DEADLOCK_PRIORITY oświadczenie. DEADLOCK_PRIORITY może być ustawiony na LOW, NORMAL lub HIGH, lub alternatywnie można ustawić dowolną liczbę całkowitą z zakresu (-10 do 10).

Q2. Jeśli wykonam select z podpowiedzią NOLOCK, czy to usunie problem?

Nie. Z kilku powodów:

Q3. Podejrzewam, że pole datetime, które jest zaznaczone jako część klauzuli WHERE w instrukcji select powoduje powolny czas wyszukiwania. Czy mogę utworzyć indeks na podstawie tego pola? Czy to / align = "left" /

Prawdopodobnie. Przyczyną impasu jest prawdopodobnie słabo zindeksowana baza danych.10 minutowe zapytania są dopuszczalne w tak wąskich warunkach, że jestem w 100% pewien, że w Twoim przypadku jest nie akceptowalne.

Z 99% pewnością oświadczam, że Twój Impas jest obudowany przez dużą tabelę skanowania sprzeczne z aktualizacjami. Zacznij od przechwycenia wykresu impasu , aby przeanalizować przyczynę. Będzie bardzo prawdopodobne, że trzeba zoptymalizować schemat swojego baza danych. Zanim dokonasz jakiejkolwiek modyfikacji, przeczytaj ten temat projektowanie indeksów oraz podpowiedzi.

 98
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 10:15:17

Oto jak ten konkretny problem impasu faktycznie wystąpił i jak został faktycznie rozwiązany. Jest to dość aktywna baza danych z 130K transakcji występujących codziennie. Indeksy w tabelach w tej bazie danych były pierwotnie grupowane. Klient poprosił nas o niezakłócone indeksy. Jak tylko to zrobiliśmy, zaczęło się impas. Kiedy przywróciliśmy indeksy jako skupione, impas zatrzymał się.

 10
Author: Elliott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 13:04:02

Odpowiedzi tutaj są warte wypróbowania, ale powinieneś również przejrzeć swój kod. Konkretnie przeczytaj odpowiedź Polyfun tutaj: Jak pozbyć się blokady w aplikacji SQL Server 2005 i C#?

Wyjaśnia problem współbieżności i jak użycie "with (updlock)" w zapytaniach może poprawić sytuację w impasie - w zależności od tego, co robi twój kod. Jeśli twój kod jest zgodny z tym wzorcem, jest to prawdopodobnie lepsza poprawka do zrobienia, zanim uciekniesz się do brudne czytanki itp.

 3
Author: Peter Barton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:08