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:
- Czy czas potrzebny na wykonanie transakcji może zwiększyć prawdopodobieństwo, że powiązany proces zostanie oznaczony jako ofiara impasu?
- jeśli wykonam select z podpowiedzią NOLOCK, czy to usunie problem?
- 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?
3 answers
Nie. SELECT jest ofiarą, ponieważ tylko odczytywał dane, dlatego transakcja ma niższy koszt związany z nią, więc jest wybierana jako ofiara:P1: Czy czas potrzebny na wykonanie transakcji może zwiększyć prawdopodobieństwo, że powiązany proces zostanie oznaczony jako ofiara impasu?
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).
Nie. Z kilku powodów:Q2. Jeśli wykonam select z podpowiedzią NOLOCK, czy to usunie problem?
- należy najpierw spróbować wyeliminować impas prawidłowo, badając przyczyny
- brudne odczyty sąniespójne odczyty .
- właściwym sposobem określenia brudnych odczytów jest użycie poziomów izolacji transakcji
- jest o wiele lepsze rozwiązanie: read committed snapshot.
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.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" /
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.
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ę.
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.
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