Jak natychmiast zabić / zatrzymać długie zapytanie SQL?


95

Używam SQL Server 2008 i jego studia zarządzania. Wykonałem zapytanie, które daje wiele wierszy. Próbowałem go anulować za pomocą czerwonego przycisku anulowania, ale nie zatrzymał się przez ostatnie 10 minut. Zwykle zatrzymuje się w ciągu 3 minut.

Jaki może być powód i jak natychmiast to zatrzymać?


czy sprawdziłeś, że jakaś aplikacja przechowuje to zapytanie?
user1102001

1
zatrzymaj i ponownie uruchom usługi sql ..
user1102001

Zmierzyłem się z tym senario, ponieważ nawet uruchamiałem wszystko w sql i chciałbym edytować mój profil, czy nie ...
user1102001

@ user1102001 - nie zmuszając Cię do niczego. Powiedziałem, że mogę i nie powinienem :)
sequel.learner

Odpowiedzi:


65

Jaki może być powód

Anulowanie zapytania jest natychmiastowe, pod warunkiem, że Twoja uwaga może dotrzeć do serwera i zostać przetworzona. Zapytanie musi być w stanie możliwym do anulowania, co prawie zawsze jest prawdziwe, chyba że wykonujesz określone operacje, takie jak wywołanie usługi WWW z SQLCLR. Jeśli Twoja uwaga nie może dotrzeć do serwera, zwykle jest to spowodowane przeciążeniem programu planującego .

Ale jeśli zapytanie jest częścią transakcji, która musi zostać wycofana, wycofanie nie może zostać przerwane. Jeśli zajmuje to 10 minut, potrzebuje 10 minut i nic nie możesz na to poradzić. Nawet ponowne uruchomienie serwera nie pomoże, a jedynie wydłuży uruchamianie, ponieważ odzyskiwanie musi zakończyć wycofywanie.

Aby odpowiedzieć, który konkretny powód dotyczy Twojej sprawy, musisz sam zbadać sprawę.


Zwróć uwagę, że program SSMS wyświetla zapytanie jako „anulowane” (w przeciwieństwie do „próby anulowania”) dopiero po otrzymaniu odpowiedzi uwagi, co oznacza najpierw opróżnienie wszystkich pośrednich wyników w potoku komunikacyjnym (np. Wszystkie wyniki w protokole TCP / IP bufory wysyłania / odbierania i wszystkie bufory w pamięci).
Remus Rusanu

1
Chciałbym, żeby powiedział „wycofywanie”
Simon_Weaver

@RemusRusanu - Co się stanie, jeśli szacowany czas wycofania wyniesie ponad 20 000 godzin? Z przyjemnością przywracam z kopii zapasowej. dba.stackexchange.com/questions/222145/ ...
youcantryreachingme

110
sp_who2 'active'

Sprawdź wartości w CPUTime i DiskIO . Zwróć uwagę na identyfikator SPID procesu o dużej wartości.

kill {SPID value}

Używam Microsoft SQL Server 2008 R2, próbowałem dowiedzieć się, co to jest SPID zapytania, które jest wykonywane i jest zawieszone, i stwierdziłem, że istnieje wiele wystąpień tego samego SELECT SQL z tym samym SPID. Kiedy próbuję wykonać polecenie KILL 114 - tutaj 114 jest wartością SPID mojego zawieszonego zapytania. Pojawia się błąd pokazany poniżej: Proszę o przewodnik. Msg 102, poziom 15, stan 1, wiersz 2 Niepoprawna składnia w pobliżu „114”.
Code Buster

42

Najpierw wykonaj poniższe polecenie:

sp_who2

Następnie wykonaj poniższe polecenie z SPID, które otrzymałeś z powyższego polecenia:

KILL {SPID value}

23

To trochę głupia odpowiedź, ale działa niezawodnie przynajmniej w moim przypadku: w studiu zarządzania, gdy „Anuluj wykonywanie zapytania” nie zatrzymuje zapytania, po prostu klikam, aby zamknąć bieżący dokument sql. pyta mnie, czy chcę anulować zapytanie, odpowiadam, że tak, i oto po kilku sekundach przestaje się wykonywać. Następnie pyta mnie, czy chcę zapisać dokument przed zamknięciem. W tym momencie mogę kliknąć Anuluj, aby dokument był otwarty i kontynuował pracę. Nie mam pojęcia, co się dzieje za kulisami, ale wydaje się, że działa.


5
W takim przypadku zapytanie może nadal działać / zawieszać się w tle, po prostu już go nie zobaczysz.
Baran51

1
Myślę, że to zabija połączenie, ponieważ po tym musisz połączyć się ponownie.
anakic

2
Zabija połączenie z SSMS, ale niekoniecznie (koniecznie) z bazą danych.
Baran51

1
Spróbowałem tego, mój sql się zawiesił. T_T
bot

1
Jeśli tego nie widzisz, to nie istnieje.
ChrisD,

14

Jeśli anulujesz i zobaczysz ten bieg

 sp_who2 'active'

(Monitor aktywności nie będzie dostępny na starym serwerze sql 2000 FYI)

Znajdź SPID, którego chcesz zabić, np. 81

Kill 81

Uruchom sp_who2 'active' ponownie, a prawdopodobnie zauważysz, że śpi ... cofa się

Aby uzyskać STATUS, uruchom ponownie KILL

Kill 81 

Wtedy otrzymasz taką wiadomość

 SPID 81: transaction rollback in progress. Estimated rollback completion: 63%. Estimated time remaining: 992 seconds.

Musiałem biec, KILL {spid} WITH STATUSONLYaby zobaczyć komunikat o stanie.
Rudey

11

Możesz użyć skrótu klawiaturowego ALT+, Breakaby zatrzymać wykonywanie zapytania. Jednak może się to nie udać we wszystkich przypadkach.


1
Ten pracował dla mnie w studiu Management. Dzięki
Vishvanathsinh Solanki

4
--Find Session Id for respective all running queries
SELECT text, getdate(),*
 FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)

---Kill specific session
kill 125

1
Dodaj wyjaśnienie do swojej odpowiedzi, edytując ją tak, aby inni mogli się z niej uczyć
Nico Haase

2

najwyraźniej na 64-bitowym serwerze sql 2008 R2, z długo działającym zapytaniem z IIS, kill spid nie wydaje się działać, zapytanie jest po prostu ponownie i ponownie uruchamiane. i wydaje się, że ponownie wykorzystuje pająka. zapytanie powoduje, że serwer sql stale zajmuje około 35% procesora i zawiesza witrynę. Zgaduję, że bc / nie może odpowiadać na inne zapytania dotyczące logowania


2
Chciałbym zobaczyć źródło tego.
Ant Swift

1

Z mojej strony mój sql zawiesił się, gdy próbowałem go zamknąć podczas niekończącego się biegu. Więc co zrobiłem, to otworzyłem mojego menedżera zadań i zakończyłem zadanie moje zapytanie sql. To zatrzyma mój sql i uruchomi go ponownie.


1

Prostą odpowiedzią, jeśli nie działa czerwone pole „stop”, jest naciśnięcie przycisków „Ctrl + Break” na klawiaturze.

Jeśli używasz SQL Server w systemie Linux, istnieje aplikacja, którą możesz dodać do swojego zasobnika systemowego o nazwie „killall”. Wystarczy kliknąć przycisk „killall”, a następnie kliknąć program, który został zatrzymany w pętli, a program zakończy działanie. Mam nadzieję, że to pomoże.


1

Cierpię na to samo od dawna. Dzieje się tak szczególnie, gdy masz połączenie ze zdalnym serwerem (co może być powolne) lub masz słabe połączenie sieciowe. Wątpię, czy Microsoft wie, jaka jest właściwa odpowiedź.

Ale odkąd próbowałem znaleźć rozwiązanie. Tylko 1 podejście laika zadziałało

  • Kliknij przycisk zamykania na karcie zapytania, na które cierpisz. Po chwili (jeśli Microsoft nie jest dla ciebie surowy !!!) może pojawić się okno z pytaniem

„Zapytanie jest obecnie wykonywane. Czy chcesz anulować zapytanie?”

  • Kliknij „Tak”

  • Po chwili zapyta, czy chcesz zapisać to zapytanie, czy nie?

  • Kliknij „Anuluj”

I opublikuj to, być może Twoje studio jest znowu stabilne, aby wykonać zapytanie.

W tle rozłącza okno zapytania z połączeniem. Zatem ponowne uruchomienie zapytania zajmie trochę czasu na ponowne połączenie się ze zdalnym serwerem. Ale uwierz mi, ten kompromis jest o wiele lepszy niż cierpienie oglądania tego timera, który działa wiecznie.

PS: To działa dla mnie, Kudos, jeśli działa również dla ciebie. !!!


1
Nadal pracował dla mnie i rozwiązał mój problem z ->
ErocM
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.