Wie kann ich eine lange SQL-Abfrage sofort beenden?


93

Ich verwende SQL Server 2008 und sein Management Studio. Ich habe eine Abfrage ausgeführt, die viele Zeilen ergibt. Ich habe versucht, es über die rote Abbrechen-Taste abzubrechen, aber es hat in den letzten 10 Minuten nicht angehalten. Es hört normalerweise innerhalb von 3 Minuten auf.

Was könnte der Grund sein und wie kann ich es sofort stoppen?


Haben Sie überprüft, ob eine Anwendung diese Abfrage enthält?
user1102001

1
Stoppen Sie und starten Sie Ihre SQL-Dienste erneut ..
user1102001

Ich habe mich diesem Szenario gestellt, da sogar ich alles in SQL ausgeführt habe und es mein Wunsch ist, mein Profil zu bearbeiten oder nicht ...
user1102001

@ user1102001 - zwingt Sie nicht, etwas zu tun. Ich sagte kann und sollte nicht :)
sequel.learner

Antworten:


66

Was könnte der Grund sein

Ein Abbruch der Abfrage erfolgt sofort, sofern Ihre Aufmerksamkeit den Server erreichen und verarbeitet werden kann. Eine Abfrage muss sich in einem abbrechbaren Zustand befinden, was fast immer der Fall ist, es sei denn, Sie führen bestimmte Vorgänge aus, z. B. das Aufrufen eines Webdienstes von SQLCLR. Wenn Ihre Aufmerksamkeit den Server nicht erreichen kann, liegt dies normalerweise an einer Überlastung des Schedulers .

Wenn Ihre Abfrage jedoch Teil einer Transaktion ist, für die ein Rollback erforderlich ist, kann der Rollback nicht unterbrochen werden. Wenn es 10 Minuten dauert, braucht es 10 Minuten und Sie können nichts dagegen tun. Selbst ein Neustart des Servers hilft nicht, sondern verlängert den Start nur, da die Wiederherstellung den Rollback beenden muss.

Um zu beantworten, welcher spezifische Grund für Ihren Fall gilt, müssen Sie sich selbst untersuchen.


Beachten Sie, dass SSMS die Abfrage erst nach Empfang der Aufmerksamkeitsantwort als "abgebrochen" anzeigt (im Gegensatz zu "Versuch abzubrechen"). Dies bedeutet, dass zuerst alle Zwischenergebnisse in der Kommunikationsleitung entleert werden (z. B. alle Ergebnisse in TCP / IP) Sende- / Empfangspuffer und alle speicherinternen Puffer).
Remus Rusanu

1
Ich wünschte, es würde "
Rollback

@RemusRusanu - Was ist, wenn die geschätzte Rollback-Zeit mehr als 20.000 Stunden beträgt? Gerne von einem Backup wiederherstellen. dba.stackexchange.com/questions/222145/…
youcantryreachingme

108
sp_who2 'active'

Überprüfen Sie die Werte unter CPUTime und DiskIO . Beachten Sie die SPID des Prozesses mit vergleichsweise großem Wert.

kill {SPID value}

Ich verwende Microsoft SQL Server 2008 R2. Ich habe versucht herauszufinden, wie die SPID der Abfrage lautet, die ausgeführt und angehalten wird, und festgestellt, dass es viele Instanzen desselben SELECT SQL mit derselben SPID gibt. Wenn ich versuche, den Befehl KILL 114 auszuführen, ist 114 der SPID-Wert meiner angehaltenen Abfrage. Ich erhalte den folgenden Fehler: Bitte führen. Meldung 102, Ebene 15, Status 1, Zeile 2 Falsche Syntax in der Nähe von '114'.
Code Buster

40

Führen Sie zuerst den folgenden Befehl aus:

sp_who2

Führen Sie danach den folgenden Befehl mit SPID aus, den Sie vom obigen Befehl erhalten haben:

KILL {SPID value}

22

Dies ist eine dumme Antwort, funktioniert aber zumindest in meinem Fall zuverlässig: Wenn in Management Studio die Abfrage "Ausführende Abfrage abbrechen" die Abfrage nicht stoppt, klicke ich einfach, um das aktuelle SQL-Dokument zu schließen. es fragt mich, ob ich die Abfrage abbrechen möchte, ich sage ja, und siehe da, in ein paar Sekunden hört es auf, ausgeführt zu werden. Danach werde ich gefragt, ob ich das Dokument vor dem Schließen speichern möchte. An dieser Stelle kann ich auf Abbrechen klicken, um das Dokument geöffnet zu halten und weiterzuarbeiten. Keine Ahnung, was sich hinter den Kulissen abspielt, aber es scheint zu funktionieren.


5
In diesem Fall wird die Abfrage möglicherweise noch im Hintergrund ausgeführt / hängt, Sie werden sie einfach nicht mehr sehen.
Widder 51

1
Ich denke, es unterbricht die Verbindung, da Sie danach die Verbindung wieder herstellen müssen.
Anakic

2
Die Verbindung zu SSMS wird unterbrochen, jedoch nicht (unbedingt) zur Datenbank.
Widder51

1
Ich habe es versucht, mein SQL hat aufgelegt. T_T
Bot

Wenn Sie es nicht sehen können, existiert es nicht.
ChrisD

13

Wenn Sie abbrechen und sehen, dass ausgeführt

 sp_who2 'active'

(Activity Monitor ist auf dem alten SQL Server 2000 nicht verfügbar.)

Finde die SPID, die du töten möchtest, zB 81

Kill 81

Führen Sie das sp_who2 'active' erneut aus und Sie werden wahrscheinlich feststellen, dass es schläft ... zurückrollen

Um den STATUS erneut auszuführen, führen Sie den KILL aus

Kill 81 

Dann erhalten Sie eine solche Nachricht

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

11

Sie können eine Tastenkombination ALT+ verwenden Break, um die Ausführung der Abfrage zu stoppen. Dies ist jedoch möglicherweise nicht in allen Fällen erfolgreich.


1
Dieser ist für mich im Management Studio gearbeitet. Danke
Vishvanathsinh Solanki

3
--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

Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, indem Sie sie so bearbeiten, dass andere daraus lernen können
Nico Haase

2

anscheinend auf SQL Server 2008 R2 64bit, mit lang laufender Abfrage von IIS scheint die Kill-Spid nicht zu funktionieren, die Abfrage wird nur immer wieder neu gestartet. und es scheint, die Spids wiederzuverwenden. Die Abfrage führt dazu, dass SQL Server ständig 35% CPU verbraucht und die Website aufhängt. Ich vermute, bc / es kann nicht auf andere Anfragen zum Anmelden antworten


2
Ich würde gerne eine Quelle dafür sehen.
Ant Swift

1

In meinem Teil legte mein SQL auf, als ich versuchte, es zu schließen, während ich endlos lief. Also öffne ich meinen Task-Manager und beende die Aufgabe meiner SQL-Abfrage. Dies stoppte meine SQL und startete es neu.


1

Eine einfache Antwort, wenn das rote Feld "Stopp" nicht funktioniert, besteht darin, die Tasten "Strg + Pause" auf der Tastatur zu drücken.

Wenn Sie SQL Server unter Linux ausführen, können Sie Ihrem System eine App namens "killall" hinzufügen. Klicken Sie einfach auf die Schaltfläche "killall" und dann auf das Programm, das sich in einer Schleife befindet, und das Programm wird beendet. Hoffentlich hilft das.


1

Ich habe seit langer Zeit unter der gleichen Sache gelitten. Dies ist besonders dann der Fall, wenn Sie mit einem Remote-Server verbunden sind (was möglicherweise langsam ist) oder wenn Sie eine schlechte Netzwerkverbindung haben. Ich bezweifle, dass Microsoft weiß, was die richtige Antwort ist.

Aber da habe ich versucht, die Lösung zu finden. Nur 1 Laienansatz funktionierte

  • Klicken Sie auf die Schaltfläche zum Schließen über der Registerkarte der Abfrage, unter der Sie leiden. Nach einer Weile (wenn Microsoft nicht hart gegen Sie ist !!!) wird möglicherweise ein Fenster angezeigt, in dem Sie dazu aufgefordert werden

"Die Abfrage wird gerade ausgeführt. Möchten Sie die Abfrage abbrechen?"

  • Klicken Sie auf "Ja"

  • Nach einer Weile werden Sie gefragt, ob Sie diese Abfrage speichern möchten oder nicht.

  • Klicken Sie auf "Abbrechen"

Und poste das, vielleicht ist dein Studio wieder stabil, um deine Abfrage auszuführen.

Im Hintergrund wird das Abfragefenster von der Verbindung getrennt. Um die Abfrage erneut auszuführen, dauert es einige Zeit, bis der Remote-Server erneut verbunden ist. Aber glauben Sie mir, dieser Kompromiss ist weitaus besser als das Leiden, diesen Timer zu sehen, der für die Ewigkeit läuft.

PS: Das funktioniert bei mir, Kudos, wenn es auch bei Ihnen funktioniert. !!!


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.